]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
java-jafs-update-20030619
authorManuel Pereira <mpereira@almaden.ibm.com>
Thu, 19 Jun 2003 17:53:09 +0000 (17:53 +0000)
committerDerrick Brashear <shadow@dementia.org>
Thu, 19 Jun 2003 17:53:09 +0000 (17:53 +0000)
FIXES 1565

updates to java jafs, make it work with new cell code.

32 files changed:
src/JAVA/classes/ErrorMessages.properties
src/JAVA/classes/org/openafs/jafs/ACL.java
src/JAVA/classes/org/openafs/jafs/AFSException.java
src/JAVA/classes/org/openafs/jafs/AFSSecurityException.java
src/JAVA/classes/org/openafs/jafs/Cell.java
src/JAVA/classes/org/openafs/jafs/Group.java
src/JAVA/classes/org/openafs/jafs/Key.java
src/JAVA/classes/org/openafs/jafs/Partition.java
src/JAVA/classes/org/openafs/jafs/Server.java
src/JAVA/classes/org/openafs/jafs/Token.java
src/JAVA/classes/org/openafs/jafs/User.java
src/JAVA/classes/org/openafs/jafs/Volume.java
src/JAVA/libjafs/ACL.c
src/JAVA/libjafs/AdminToken.c
src/JAVA/libjafs/Cell.c
src/JAVA/libjafs/File.c
src/JAVA/libjafs/FileInputStream.c
src/JAVA/libjafs/FileOutputStream.c
src/JAVA/libjafs/Group.c
src/JAVA/libjafs/Internal.c
src/JAVA/libjafs/Internal.h
src/JAVA/libjafs/Key.c
src/JAVA/libjafs/Makefile.in
src/JAVA/libjafs/Partition.c
src/JAVA/libjafs/Process.c
src/JAVA/libjafs/Server.c
src/JAVA/libjafs/User.c
src/JAVA/libjafs/UserToken.c
src/JAVA/libjafs/Volume.c
src/afs/UKERNEL/afs_usrops.c
src/afs/afs_cell.c
src/libuafs/README

index 2f201241318013f8d25f8cf41b9089f2aa999958..4821ffd682b12226d35c67f0acdd3cc9d197c2c7 100644 (file)
@@ -11,6 +11,26 @@ E1002 = Session has expired, please login again
 E1003 = Operation aborted
 E1004 = Operation was forced to abort
 
+#-----------------------------------------------------------
+# Internal JAFS Error Codes
+#-----------------------------------------------------------
+E1050 = Could not allocate memory.
+E1051 = Could not find specified Java class.
+E1052 = Could not find specified Java method.
+E1053 = Could not find specified Java field.
+E1054 = Invalid argument value, argument is NULL.
+E1055 = Username provided is NULL.
+E1056 = Password provided is NULL.
+E1057 = Group name provided is NULL.
+E1058 = Group owner provided is NULL.
+E1059 = Volume name provided is NULL.
+E1060 = Partition name provided is NULL.
+E1061 = Process name provided is NULL.
+E1062 = Server name provided is NULL.
+E1063 = Cell name provided is NULL.
+E1064 = Invalid path name provided, path is NULL.
+E1065 = Invalid ACL provided, string is NULL.
+
 #-----------------------------------------------------------
 # Standard UNIX Error Codes
 #-----------------------------------------------------------
index 10b1b96908c745688b6835b3155f30dcf09e78cf..61e5ca22f89974d41d7857c1766e2c4dc82eb26a 100644 (file)
@@ -33,6 +33,8 @@ import java.util.StringTokenizer;
  * This class is an extension of the standard Java File class with file-based 
  * manipulation methods overridden by integrated AFS native methods.
  *
+ * @version 2.2, 03/24/2003 - Added new Delta ACL functionality and changes 
+ *                            from Stonehenge.
  * @version 2.0, 04/18/2001 - Completely revised class for efficiency.
  */
 
@@ -41,9 +43,23 @@ public class ACL implements Serializable, Comparable
   private ACL.Entry[] positiveEntries;
   private ACL.Entry[] negativeEntries;
 
-  private String path;
+  private ACL.Entry[] positiveExpungeEntries;
+  private ACL.Entry[] negativeExpungeEntries;
+
+  /** 
+   * Path for this ACL, if null then this ACL instance is most likely a 
+   * Delta ACL.
+   */
+  private String path = null;
  
-  public ACL(String path) throws AFSException
+  private ACL()
+  {
+  }
+  public ACL( String path ) throws AFSException
+  {
+    this( path, true );
+  }
+  public ACL( String path, boolean init ) throws AFSException
   {
     int numberPositiveEntries = 0;
     int numberNegativeEntries = 0;
@@ -52,85 +68,562 @@ public class ACL implements Serializable, Comparable
 
     this.path = path;
 
-    StringTokenizer st = new StringTokenizer(getACLString(path), "\n\t");
-
-    buffer = st.nextToken();
-    numberPositiveEntries = new Integer(buffer).intValue();
-    positiveEntries = new ACL.Entry[numberPositiveEntries];
-
-    buffer = st.nextToken();
-    numberNegativeEntries = new Integer(buffer).intValue();
-    negativeEntries = new ACL.Entry[numberNegativeEntries];
-
-    for(int i = 0; i < numberPositiveEntries; i++)
-    {
-      aclEntry = new ACL.Entry();
-      aclEntry.setUser(st.nextToken());
-      aclEntry.setPermissions(new Integer(st.nextToken()).intValue());
-      positiveEntries[i] = aclEntry;
-    }
-
-    for(int i = 0; i < numberNegativeEntries; i++)
-    {
-      aclEntry = new ACL.Entry();
-      aclEntry.setUser(st.nextToken());
-      aclEntry.setPermissions(new Integer(st.nextToken()).intValue());
-      negativeEntries[i] = aclEntry;
+    if ( init ) {
+      StringTokenizer st = new StringTokenizer( getACLString(path), "\n\t" );
+  
+      buffer = st.nextToken();
+      numberPositiveEntries = new Integer(buffer).intValue();
+      positiveEntries = new ACL.Entry[numberPositiveEntries];
+  
+      buffer = st.nextToken();
+      numberNegativeEntries = new Integer(buffer).intValue();
+      negativeEntries = new ACL.Entry[numberNegativeEntries];
+  
+      for(int i = 0; i < numberPositiveEntries; i++)
+      {
+        aclEntry = new ACL.Entry();
+        aclEntry.setUser(st.nextToken());
+        aclEntry.setPermissions(new Integer(st.nextToken()).intValue());
+        positiveEntries[i] = aclEntry;
+      }
+  
+      for(int i = 0; i < numberNegativeEntries; i++)
+      {
+        aclEntry = new ACL.Entry();
+        aclEntry.setUser(st.nextToken());
+        aclEntry.setPermissions(new Integer(st.nextToken()).intValue());
+        negativeEntries[i] = aclEntry;
+      }
+    } else {
+      positiveEntries = new ACL.Entry[0];
+      negativeEntries = new ACL.Entry[0];
     }
   }
+  /**
+   * Returns the total number of ACL entries, this is the sum of positive
+   * and negative entries.
+   *
+   * @return Total number of ACL entries
+   */
   public int getEntryCount()
   {
-    return positiveEntries.length + positiveEntries.length;
+    return getPositiveEntryCount() + getNegativeEntryCount();
   }
+  /**
+   * Returns the path this ACL instance is bound to.
+   *
+   * @return Path for this ACL
+   */
   public String getPath()
   {
     return path;
   }
+  /**
+   * Writes the ACL to AFS, making all changes immediately effective.
+   * This method requires an active connection to AFS.
+   */
+  public void flush() throws AFSException
+  {
+    setACLString(path, getFormattedString());
+  }
+
+
+  /*--------------------------------------------------------------------------*/
+  /* Positive ACL Methods                                                     */
+  /*--------------------------------------------------------------------------*/
+
+  /**
+   * Returns the number of positive ACL entries for this ACL instance.
+   *
+   * @return Positive ACL entry count
+   */
+  public int getPositiveEntryCount()
+  {
+    return ( positiveEntries == null ) ? 0 : positiveEntries.length;
+  }
+  /**
+   * Returns all positive ACL entries for this ACL instance.
+   *
+   * @return All positive ACL entries
+   */
   public ACL.Entry[] getPositiveEntries()
   {
-    return positiveEntries;
+    return ( positiveEntries == null ) ? new ACL.Entry[0] : positiveEntries;
+  }
+  /**
+   * Returns the positive ACL entry associated with the specified 
+   * user/group name.
+   *
+   * @param  name Name of user/group for desired ACL entry.
+   * @return Positive ACL entry
+   * @see ACL.Entry#getUser()
+   */
+  public Entry getPositiveEntry(String name)
+  {
+    int n = getPositiveEntryCount();
+    for (int i = 0; i < n; i++) {
+      if (positiveEntries[i].getUser().equalsIgnoreCase(name)) {
+        return positiveEntries[i];
+      }
+    }
+    return null;
   }
-  public void addPositiveEntry(ACL.Entry entry) throws AFSException
+  /**
+   * Returns all positive ACL entries to be expunged; used in Delta ACLs.
+   *
+   * @return All positive ACL entries
+   */
+  public ACL.Entry[] getPositiveExpungeEntries()
   {
-    int n = positiveEntries.length;
+    return ( positiveExpungeEntries == null ) ? new ACL.Entry[0] : positiveExpungeEntries;
+  }
+  /**
+   * Returns <code>true</code> if this ACL contains the specified ACL entry.
+   *
+   * @param  entry Positive ACL entry
+   * @return <code>true</code> if the specified ACL entry is present; 
+   *         <code>false</code> otherwise.
+   */
+  public boolean containsPositiveEntry(Entry entry)
+  {
+    int n = getPositiveEntryCount();
+    for (int i = 0; i < n; i++) {
+      if (positiveEntries[i].equals(entry)) {
+        return true;
+      }
+    }
+    return false;
+  }
+  /**
+   * Adds a single positive ACL entry to this ACL instance.
+   *
+   * @param entry ACL.Entry object to add
+   */
+  public void addPositiveEntry( ACL.Entry entry ) throws AFSException
+  {
+    int n = getPositiveEntryCount();
     ACL.Entry[] e = new ACL.Entry[n + 1];
-    System.arraycopy(positiveEntries, 0, e, 0, n);
+    if ( n > 0 ) System.arraycopy(positiveEntries, 0, e, 0, n);
     e[n] = entry;
     positiveEntries = e;
-    setACLString(path, getFormattedString());
+    update();
   }
-  public void setPositiveEntries(ACL.Entry[] entries) throws AFSException
+  /**
+   * Adds the provided list of positive ACL entries to this ACL instance.
+   *
+   * @param entries Array of ACL.Entry objects to add
+   */
+  public void addPositiveEntries( ACL.Entry[] entries ) throws AFSException
+  {
+    int n = getPositiveEntryCount();
+    ACL.Entry[] e = new ACL.Entry[n + entries.length];
+    System.arraycopy(positiveEntries, 0, e, 0, n);
+    System.arraycopy(entries,0,e,n,entries.length);
+    positiveEntries = e;
+    update();
+  }
+  /**
+   * Sets the complete array of positive ACL entries to the provided
+   * ACL entry list (<code>entries</code>) for this ACL instance.
+   *
+   * @param entries Array of ACL.Entry objects that represent this
+   *                ACL's positive entry list.
+   */
+  public void setPositiveEntries( ACL.Entry[] entries ) throws AFSException
   {
     this.positiveEntries = entries;
-    setACLString(path, getFormattedString());
+    update();
   }
+  /**
+   * Add a positive ACL entry to the list of positive ACL entries to be 
+   * expunged; used in Delta ACLs.
+   *
+   * @param entry Positive ACL entries to be expunged.
+   */
+  public void addPositiveExpungeEntry( ACL.Entry entry ) throws AFSException
+  {
+    int n = ( positiveExpungeEntries == null ) ? 0 : positiveExpungeEntries.length;
+    ACL.Entry[] e = new ACL.Entry[n + 1];
+    if ( n > 0 ) System.arraycopy(positiveExpungeEntries, 0, e, 0, n);
+    e[n] = entry;
+    positiveExpungeEntries = e;
+    update();
+  }
+
+  /**
+   * Removes a single positive ACL entry from this ACL instance.
+   *
+   * @param entry ACL.Entry object to removed
+   */
+  public void removePositiveEntry(Entry entry) throws AFSException
+  {
+    int n = getPositiveEntryCount();
+    ArrayList list = new ArrayList();
+
+    for (int i = 0; i < n; i++) {
+      if (!positiveEntries[i].equals(entry)) {
+        list.add(positiveEntries[i]);
+      }
+    }
+
+    positiveEntries = (ACL.Entry[]) list.toArray(new ACL.Entry[list.size()]);
+    update();
+  }
+  /**
+   * Removes all positive ACL entries from this ACL instance.
+   */
+  public void removeAllPositiveEntries() throws AFSException
+  {
+    positiveEntries = new Entry[0];
+    update();
+  }
+
+
+  /*--------------------------------------------------------------------------*/
+  /* Negative ACL Methods                                                     */
+  /*--------------------------------------------------------------------------*/
+
+  /**
+   * Returns the number of negative ACL entries for this ACL instance.
+   *
+   * @return Negative ACL entry count
+   */
+  public int getNegativeEntryCount()
+  {
+    return ( negativeEntries == null ) ? 0 : negativeEntries.length;
+  }
+  /**
+   * Returns all negative ACL entries for this ACL instance.
+   *
+   * @return All negative ACL entries
+   */
   public ACL.Entry[] getNegativeEntries()
   {
-    return negativeEntries;
+    return ( negativeEntries == null ) ? new ACL.Entry[0] : negativeEntries;
+  }
+  /**
+   * Returns the negative ACL entry associated with the specified 
+   * user/group name.
+   *
+   * @param  name Name of user/group for desired ACL entry.
+   * @return Negative ACL entry
+   * @see ACL.Entry#getUser()
+   */
+  public Entry getNegativeEntry(String name)
+  {
+    int n = getNegativeEntryCount();
+    for (int i = 0; i < n; i++) {
+      if (negativeEntries[i].getUser().equalsIgnoreCase(name)) {
+        return negativeEntries[i];
+      }
+    }
+    return null;
   }
-  public void addNegativeEntry(ACL.Entry entry) throws AFSException
+  /**
+   * Returns all negative ACL entries to be expunged; used in Delta ACLs.
+   *
+   * @return All negative ACL entries to be expunged.
+   */
+  public ACL.Entry[] getNegativeExpungeEntries()
   {
-    int n = negativeEntries.length;
+    return ( negativeExpungeEntries == null ) ? new ACL.Entry[0] : negativeExpungeEntries;
+  }
+  /**
+   * Returns <code>true</code> if this ACL contains the specified ACL entry.
+   *
+   * @param  entry Negative ACL entry
+   * @return <code>true</code> if the specified ACL entry is present; 
+   *         <code>false</code> otherwise.
+   */
+  public boolean containsNegative(Entry entry)
+  {
+    int n = getNegativeEntryCount();
+    for (int i = 0; i < n; i++) {
+      if (negativeEntries[i].equals(entry)) {
+        return true;
+      }
+    }
+    return false;
+  }
+  /**
+   * Adds a single negative ACL entry to this ACL instance.
+   *
+   * @param entry ACL.Entry object to add
+   */
+  public void addNegativeEntry( ACL.Entry entry ) throws AFSException
+  {
+    int n = getNegativeEntryCount();
     ACL.Entry[] e = new ACL.Entry[n + 1];
-    System.arraycopy(negativeEntries, 0, e, 0, n);
+    if ( n > 0 ) System.arraycopy(negativeEntries, 0, e, 0, n);
     e[n] = entry;
     negativeEntries = e;
-    setACLString(path, getFormattedString());
+    update();
+  }
+  /**
+   * Adds the provided list of negative ACL entries to this ACL instance.
+   *
+   * @param entries Array of ACL.Entry objects to add
+   */
+  public void addNegativeEntries( ACL.Entry[] entries ) throws AFSException
+  {
+    int n = getNegativeEntryCount();
+    ACL.Entry[] e = new ACL.Entry[n + entries.length];
+    System.arraycopy(negativeEntries, 0, e, 0, n);
+    System.arraycopy(entries,0,e,n,entries.length);
+    negativeEntries = e;
+    update();
   }
-  public void setNegativeEntries(ACL.Entry[] entries) throws AFSException
+  /**
+   * Add a negative ACL entry to the list of negative ACL entries to be 
+   * expunged; used in Delta ACLs.
+   *
+   * @param entry Negative ACL entries to be expunged.
+   */
+  public void addNegativeExpungeEntry( ACL.Entry entry ) throws AFSException
+  {
+    int n = ( negativeExpungeEntries == null ) ? 0 : negativeExpungeEntries.length;
+    ACL.Entry[] e = new ACL.Entry[n + 1];
+    if ( n > 0 ) System.arraycopy(negativeExpungeEntries, 0, e, 0, n);
+    e[n] = entry;
+    negativeExpungeEntries = e;
+    update();
+  }
+  /**
+   * Sets the complete array of negative ACL entries to the provided
+   * ACL entry list (<code>entries</code>) for this ACL instance.
+   *
+   * @param entries Array of ACL.Entry objects that represent this
+   *                ACL's negative entry list.
+   */
+  public void setNegativeEntries( ACL.Entry[] entries ) throws AFSException
   {
     this.negativeEntries = entries;
-    setACLString(path, getFormattedString());
+    update();
   }
 
-  public void flush() throws AFSException
+  /**
+   * Removes a single negative ACL entry from this ACL instance.
+   *
+   * @param entry ACL.Entry object to removed
+   */
+  public void removeNegativeEntry(Entry entry) throws AFSException
   {
-    setACLString(path, getFormattedString());
+    int n = getNegativeEntryCount();
+    ArrayList list = new ArrayList();
+        
+    for (int i = 0; i < n; i++) {
+      if (!negativeEntries[i].equals(entry)) {
+        list.add(negativeEntries[i]);
+      }
+    }
+
+    negativeEntries = (ACL.Entry[]) list.toArray(new ACL.Entry[list.size()]);
+    update();
+  }
+  
+  /**
+   * Removes all negative ACL entries from this ACL instance.
+   */
+  public void removeAllNegativeEntries() throws AFSException
+  {
+    negativeEntries = new Entry[0];
+    update();
+  }
+  
+
+  /*--------------------------------------------------------------------------*/
+  /* Delta ACL Methods                                                        */
+  /*--------------------------------------------------------------------------*/
+
+  /**
+   * Returns a "Delta ACL", which is an ACL that represents only the difference
+   * (delta) of two ACLs, relative to the current ACL instance by the provided
+   * ACL specified by <code>acl</code>.
+   *
+   * <P> This ACL instance represents the base or reference object while the 
+   * provided ACL (<code>acl</code>) represents the object in question. 
+   * Therefore, if the provided ACL has an entry that differs from the base ACL,
+   * then the resulting Delta ACL will contain that entry found in the provided 
+   * ACL; base ACL entries are never entered into the Delta ACL, but rather are
+   * used solely for comparison.
+   *
+   * @param acl the ACL to compare this ACL instance to
+   * @return Delta ACL by comparing this ACL instance with <code>acl</code>
+   */
+  public ACL getDeltaACL( ACL acl ) throws AFSException
+  {
+    ACL delta = new ACL();
+    int n = getPositiveEntryCount();
+    
+    ACL.Entry[] pEntries = acl.getPositiveEntries();
+    for ( int i = 0; i < pEntries.length; i++ )
+    {
+      boolean match = false;
+      for ( int j = 0; j < n; j++ )
+      {
+        if ( pEntries[i].equals( positiveEntries[j] ) ) {
+          match = true;
+          break;
+        }
+      }
+      if ( !match ) delta.addPositiveEntry( pEntries[i] );
+    }
+
+    // Check for positive entries that need to be expunged.
+    n = getPositiveEntryCount();
+    if ( n > pEntries.length ) {
+      for ( int i = 0; i < n; i++ )
+      {
+        String eu = positiveEntries[i].getUser();
+        boolean match = false;
+        for ( int j = 0; j < pEntries.length; j++ )
+        {
+          if ( eu != null && eu.equals( pEntries[j].getUser() ) ) {
+            match = true;
+            break;
+          }
+        }
+        if ( !match ) delta.addPositiveExpungeEntry( positiveEntries[i] );
+      }
+    }
+
+    n = getNegativeEntryCount();
+    ACL.Entry[] nEntries = acl.getNegativeEntries();
+    for ( int i = 0; i < nEntries.length; i++ )
+    {
+      boolean match = false;
+      for ( int j = 0; j < n; j++ )
+      {
+        if ( nEntries[i].equals( negativeEntries[j] ) ) {
+          match = true;
+          break;
+        }
+      }
+      if ( !match ) delta.addNegativeEntry( nEntries[i] );
+    }
+
+    // Check for negative entries that need to be expunged.
+    n = getNegativeEntryCount();
+    if ( n > nEntries.length ) {
+      for ( int i = 0; i < n; i++ )
+      {
+        String eu = negativeEntries[i].getUser();
+        boolean match = false;
+        for ( int j = 0; j < nEntries.length; j++ )
+        {
+          if ( eu != null && eu.equals( nEntries[j].getUser() ) ) {
+            match = true;
+            break;
+          }
+        }
+        if ( !match ) delta.addNegativeExpungeEntry( negativeEntries[i] );
+      }
+    }
+
+    return delta;
   }
 
-  private ACL.Entry[] getNonEmptyEntries(ACL.Entry[] entries)
+  /**
+   * Updates the current ACL instance by replacing, adding, or deleting 
+   * ACL entries designated by the specified Delta ACL (<code>delta</code>).
+   *
+   * <P> If the provided Delta ACL has an entry that differs from this ACL 
+   * instance, then the ACL entry of the Delta ACL will be set.
+   *
+   * @param delta the Delta ACL to be applied to this ACL instance
+   */
+  public void update( ACL delta ) throws AFSException
   {
-    ArrayList response = new ArrayList(entries.length);
+    ArrayList pos = new ArrayList( this.getPositiveEntryCount() );
+    ArrayList neg = new ArrayList( this.getNegativeEntryCount() );
+
+    ACL.Entry[] pExpungeEntries = delta.getPositiveExpungeEntries();
+    ACL.Entry[] nExpungeEntries = delta.getNegativeExpungeEntries();
+
+    ACL.Entry[] pEntries = delta.getPositiveEntries();
+    ACL.Entry[] nEntries = delta.getNegativeEntries();
+
+    // Delete positive expunge entries first
+    int n = getPositiveEntryCount();
+    for ( int i = 0; i < n; i++ )
+    {
+      boolean match = false;
+      for ( int j = 0; j < pExpungeEntries.length; j++ )
+      {
+        if ( pExpungeEntries[j].equals( positiveEntries[i] ) ) {
+          match = true;
+          break;
+        }
+      }
+      if ( !match ) pos.add( positiveEntries[i] );
+    }
+
+    // Now check for entries that need replacing
+    for ( int i = 0; i < pEntries.length; i++ )
+    {
+      boolean match = false;
+      String user = pEntries[i].getUser();
+      for ( int j = 0; j < pos.size(); j++ )
+      {
+        if ( user.equals( ((ACL.Entry)pos.get(j)).getUser() ) ) {
+          pos.set( j, pEntries[i] );
+          match = true;
+          break;
+        }
+      }
+      if ( !match ) pos.add( pEntries[i] );
+    }
+    setPositiveEntries( (ACL.Entry[])pos.toArray(new ACL.Entry[pos.size()]) );
+
+    // Delete negative expunge entries next
+    n = getNegativeEntryCount();
+    for ( int i = 0; i < n; i++ )
+    {
+      boolean match = false;
+      for ( int j = 0; j < nExpungeEntries.length; j++ )
+      {
+        if ( nExpungeEntries[j].equals( negativeEntries[i] ) ) {
+          match = true;
+          break;
+        }
+      }
+      if ( !match ) neg.add( negativeEntries[i] );
+    }
+
+    // Now check for entries that need replacing (negative)
+    for ( int i = 0; i < nEntries.length; i++ )
+    {
+      boolean match = false;
+      String user = nEntries[i].getUser();
+      for ( int j = 0; j < neg.size(); j++ )
+      {
+        if ( user.equals( ((ACL.Entry)neg.get(j)).getUser() ) ) {
+          neg.set( j, nEntries[i] );
+          match = true;
+          break;
+        }
+      }
+      if ( !match ) neg.add( nEntries[i] );
+    }
+    setNegativeEntries( (ACL.Entry[])neg.toArray(new ACL.Entry[neg.size()]) );
+  }
+
+
+  /*--------------------------------------------------------------------------*/
+  /* Private Methods                                                          */
+  /*--------------------------------------------------------------------------*/
+
+  /**
+   * Returns a resized array containing only valid (non-empty) ACL entries.
+   *
+   * @param  entries Original array of entries, possibly containing empty 
+   *                 entries.
+   * @return         All non-empty ACL entries
+   */
+  private ACL.Entry[] getNonEmptyEntries( ACL.Entry[] entries )
+  {
+    if ( entries == null ) return new ACL.Entry[0];
+    ArrayList list = new ArrayList( entries.length );
     for (int i = 0; i < entries.length; i++)
     {
       boolean isNonEmpty = entries[i].canRead()   ||
@@ -140,23 +633,28 @@ public class ACL implements Serializable, Comparable
                            entries[i].canDelete() ||
                            entries[i].canLock()   ||
                            entries[i].canAdmin();
-      if (isNonEmpty) response.add(entries[i]);
+      if (isNonEmpty) list.add(entries[i]);
     }
-    if (response.size() == entries.length) return entries;
-    return (ACL.Entry[])response.toArray(new ACL.Entry[response.size()]);
+    if (list.size() == entries.length) return entries;
+    return (ACL.Entry[])list.toArray(new ACL.Entry[list.size()]);
   }
 
-  private void entriesToString(ACL.Entry[] entries, StringBuffer response)
+  private void entriesToString( ACL.Entry[] entries, StringBuffer buffer )
   {
     for (int i = 0; i < entries.length; i++)
     {
-      this.entryToString((ACL.Entry)entries[i], response);
+      this.entryToString((ACL.Entry)entries[i], buffer);
     }
   }
 
-  private void entryToString(ACL.Entry entry, StringBuffer response)
+  private void entryToString( ACL.Entry entry, StringBuffer buffer )
+  {
+    buffer.append(entry.getUser() + '\t' + entry.getPermissionsMask() + '\n');
+  }
+
+  private void update() throws AFSException
   {
-    response.append(entry.getUser() + '\t' + entry.getPermissionsMask() + '\n');
+    if ( path != null ) setACLString(path, getFormattedString());
   }
 
   /**
@@ -179,7 +677,10 @@ public class ACL implements Serializable, Comparable
     return out.toString();
   }
 
-  /////////////// custom override methods ////////////////////
+
+  /*--------------------------------------------------------------------------*/
+  /* Custom Override Methods                                                  */
+  /*--------------------------------------------------------------------------*/
 
   /**
    * Compares two ACL objects respective to their paths and does not
@@ -234,9 +735,14 @@ public class ACL implements Serializable, Comparable
     ACL.Entry[] nonEmptyPos = this.getNonEmptyEntries(this.getPositiveEntries());
     ACL.Entry[] nonEmptyNeg = this.getNonEmptyEntries(this.getNegativeEntries());
 
-    StringBuffer out = new StringBuffer("ACL for ");
-    out.append(path);
-    out.append("\n");
+    StringBuffer out = new StringBuffer();
+    if ( path == null ) {
+      out.append("Delta ACL\n");
+    } else {
+      out.append("ACL for ");
+      out.append(path);
+      out.append("\n");
+    }
     out.append("Positive Entries:\n");
     for (int i = 0; i < nonEmptyPos.length; i++) {
       out.append("  ");
@@ -250,10 +756,33 @@ public class ACL implements Serializable, Comparable
       }
     }
 
+    // Check to see if this is a Delta ACL
+    if ( path == null ) {
+      nonEmptyPos = this.getNonEmptyEntries(this.getPositiveExpungeEntries());
+      nonEmptyNeg = this.getNonEmptyEntries(this.getNegativeExpungeEntries());
+
+      if (nonEmptyPos.length > 0) {
+        out.append("Positive Entries to Delete:\n");
+        for (int i = 0; i < nonEmptyPos.length; i++) {
+          out.append("  ");
+          out.append(nonEmptyPos[i].toString());
+        }
+      }
+      if (nonEmptyNeg.length > 0) {
+        out.append("Negative Entries to Delete:\n");
+        for (int i = 0; i < nonEmptyNeg.length; i++) {
+          out.append("  ");
+          out.append(nonEmptyNeg[i].toString());
+        }
+      }
+    }
+
     return out.toString();
   }
 
-  /////////////// native methods ////////////////////
+  /*--------------------------------------------------------------------------*/
+  /* Native Methods                                                           */
+  /*--------------------------------------------------------------------------*/
 
   /**
    * Returns a formatted String representing the ACL for the specified path.
@@ -278,7 +807,7 @@ public class ACL implements Serializable, Comparable
   private native void setACLString(String path, String aclString) throws AFSException;
 
   /*====================================================================*/
-  /* INNER CLASSES  */
+  /* INNER CLASSES                                                      */
   /*====================================================================*/
 
   /**
@@ -456,13 +985,13 @@ public class ACL implements Serializable, Comparable
       username = user;
     }
     /** 
-     * <IMG SRC="file.gif" ALT="File Permission" WIDTH="15" HEIGHT="15" BORDER="0"> Tests whether the ACL permits <code>read</code> access.
+     * <IMG SRC="file.gif" ALT="File Permission" WIDTH="16" HEIGHT="16" BORDER="0"> Tests whether the ACL permits <code>read</code> access.
      *
      * <p> This permission enables a user to read the contents of files in the directory 
      * and to obtain complete status information for the files (read/retrieve the file 
      * attributes).
      *
-     * <p><FONT COLOR="666699"><IMG SRC="file.gif" ALT="File Permission" WIDTH="15" HEIGHT="15" BORDER="0"> <U><B>File Permission</B></U></FONT><BR>
+     * <p><FONT COLOR="666699"><IMG SRC="file.gif" ALT="File Permission" WIDTH="16" HEIGHT="16" BORDER="0"> <U><B>File Permission</B></U></FONT><BR>
      * This permission is meaningful with respect to files in 
      * a directory, rather than the directory itself or its subdirectories. 
      *
@@ -487,7 +1016,7 @@ public class ACL implements Serializable, Comparable
       r = flag;
     }
     /** 
-     * <IMG SRC="folder.gif" ALT="Directory Permission" WIDTH="15" HEIGHT="15" BORDER="0"> Tests whether the ACL permits lookup access.
+     * <IMG SRC="folder.gif" ALT="Directory Permission" WIDTH="16" HEIGHT="16" BORDER="0"> Tests whether the ACL permits lookup access.
      *
      * <p> This permission functions as something of a gate keeper for access to the directory 
      * and its files, because a user must have it in order to exercise any other permissions. 
@@ -507,7 +1036,7 @@ public class ACL implements Serializable, Comparable
      * the directory. Those operations require the <code>lookup</code> permission on the ACL
      * of the subdirectory itself.
      *
-     * <p><FONT COLOR="666699"><IMG SRC="folder.gif" ALT="Directory Permission" WIDTH="15" HEIGHT="15" BORDER="0"> <U><B>Directory Permission</B></U></FONT><BR>
+     * <p><FONT COLOR="666699"><IMG SRC="folder.gif" ALT="Directory Permission" WIDTH="16" HEIGHT="16" BORDER="0"> <U><B>Directory Permission</B></U></FONT><BR>
      * This permission is meaningful with respect to the 
      * directory itself. For example, the <code>insert</code> permission (see: {@link #canInsert})
      * does not control addition of data to a file, but rather creation of a new file or 
@@ -534,13 +1063,13 @@ public class ACL implements Serializable, Comparable
       l = flag;
     }
     /** 
-     * <IMG SRC="folder.gif" ALT="Directory Permission" WIDTH="15" HEIGHT="15" BORDER="0"> Tests whether the ACL permits <code>insert</code> access.
+     * <IMG SRC="folder.gif" ALT="Directory Permission" WIDTH="16" HEIGHT="16" BORDER="0"> Tests whether the ACL permits <code>insert</code> access.
      *
      * <p> This permission enables a user to add new files to the directory, either by creating 
      * or copying, and to create new subdirectories. It does not extend into any subdirectories,
      * which are protected by their own ACLs.
      *
-     * <p><FONT COLOR="666699"><IMG SRC="folder.gif" ALT="Directory Permission" WIDTH="15" HEIGHT="15" BORDER="0"> <U><B>Directory Permission</B></U></FONT><BR>
+     * <p><FONT COLOR="666699"><IMG SRC="folder.gif" ALT="Directory Permission" WIDTH="16" HEIGHT="16" BORDER="0"> <U><B>Directory Permission</B></U></FONT><BR>
      * This permission is meaningful with respect to the 
      * directory itself. For example, the <code>insert</code> permission (see: {@link #canInsert})
      * does not control addition of data to a file, but rather creation of a new file or 
@@ -567,13 +1096,13 @@ public class ACL implements Serializable, Comparable
       i = flag;
     }
     /** 
-     * <IMG SRC="folder.gif" ALT="Directory Permission" WIDTH="15" HEIGHT="15" BORDER="0"> Tests whether the ACL permits <code>delete</code> access.
+     * <IMG SRC="folder.gif" ALT="Directory Permission" WIDTH="16" HEIGHT="16" BORDER="0"> Tests whether the ACL permits <code>delete</code> access.
      *
      * <p> This permission enables a user to remove files and subdirectories from the directory 
      * or move them into other directories (assuming that the user has the <code>insert</code>
      * (see: {@link #canInsert}) permission on the ACL of the other directories).
      *
-     * <p><FONT COLOR="666699"><IMG SRC="folder.gif" ALT="Directory Permission" WIDTH="15" HEIGHT="15" BORDER="0"> <U><B>Directory Permission</B></U></FONT><BR>
+     * <p><FONT COLOR="666699"><IMG SRC="folder.gif" ALT="Directory Permission" WIDTH="16" HEIGHT="16" BORDER="0"> <U><B>Directory Permission</B></U></FONT><BR>
      * This permission is meaningful with respect to the 
      * directory itself. For example, the <code>insert</code> permission (see: {@link #canInsert})
      * does not control addition of data to a file, but rather creation of a new file or 
@@ -600,12 +1129,12 @@ public class ACL implements Serializable, Comparable
       d = flag;
     }
     /** 
-     * <IMG SRC="file.gif" ALT="File Permission" WIDTH="15" HEIGHT="15" BORDER="0"> Tests whether the ACL permits <code>write</code> access.
+     * <IMG SRC="file.gif" ALT="File Permission" WIDTH="16" HEIGHT="16" BORDER="0"> Tests whether the ACL permits <code>write</code> access.
      *
      * <p> This permission enables a user to modify the contents of files in the directory 
      * and to change their operating system specific mode bits. 
      *
-     * <p><FONT COLOR="666699"><IMG SRC="file.gif" ALT="File Permission" WIDTH="15" HEIGHT="15" BORDER="0"> <U><B>File Permission</B></U></FONT><BR>
+     * <p><FONT COLOR="666699"><IMG SRC="file.gif" ALT="File Permission" WIDTH="16" HEIGHT="16" BORDER="0"> <U><B>File Permission</B></U></FONT><BR>
      * This permission is meaningful with respect to files in 
      * a directory, rather than the directory itself or its subdirectories. 
      *
@@ -630,12 +1159,12 @@ public class ACL implements Serializable, Comparable
       w = flag;
     }
     /** 
-     * <IMG SRC="file.gif" ALT="File Permission" WIDTH="15" HEIGHT="15" BORDER="0"> Tests whether the ACL permits the <code>lock</code> authority.
+     * <IMG SRC="file.gif" ALT="File Permission" WIDTH="16" HEIGHT="16" BORDER="0"> Tests whether the ACL permits the <code>lock</code> authority.
      *
      * <p> This permission enables the user to run programs that issue system calls to 
      * lock files in the directory. 
      *
-     * <p><FONT COLOR="666699"><IMG SRC="file.gif" ALT="File Permission" WIDTH="15" HEIGHT="15" BORDER="0"> <U><B>File Permission</B></U></FONT><BR>
+     * <p><FONT COLOR="666699"><IMG SRC="file.gif" ALT="File Permission" WIDTH="16" HEIGHT="16" BORDER="0"> <U><B>File Permission</B></U></FONT><BR>
      * This permission is meaningful with respect to files in 
      * a directory, rather than the directory itself or its subdirectories. 
      *
@@ -660,7 +1189,7 @@ public class ACL implements Serializable, Comparable
       k = flag;
     }
     /** 
-     * <IMG SRC="folder.gif" ALT="Directory Permission" WIDTH="15" HEIGHT="15" BORDER="0"> Tests whether the ACL permits <code>administer</code> access.
+     * <IMG SRC="folder.gif" ALT="Directory Permission" WIDTH="16" HEIGHT="16" BORDER="0"> Tests whether the ACL permits <code>administer</code> access.
      *
      * <p> This permission enables a user to change the directory's ACL. Members of the 
      * <code>system:administrators</code> group implicitly have this permission on every 
@@ -668,7 +1197,7 @@ public class ACL implements Serializable, Comparable
      * owner of a directory implicitly has this permission on its ACL and those of all 
      * directories below it that he or she owns. 
      *
-     * <p><FONT COLOR="666699"><IMG SRC="folder.gif" ALT="Directory Permission" WIDTH="15" HEIGHT="15" BORDER="0"> <U><B>Directory Permission</B></U></FONT><BR>
+     * <p><FONT COLOR="666699"><IMG SRC="folder.gif" ALT="Directory Permission" WIDTH="16" HEIGHT="16" BORDER="0"> <U><B>Directory Permission</B></U></FONT><BR>
      * This permission is meaningful with respect to the 
      * directory itself. For example, the <code>insert</code> permission (see: {@link #canInsert})
      * does not control addition of data to a file, but rather creation of a new file or 
@@ -732,12 +1261,3 @@ public class ACL implements Serializable, Comparable
 
   }
 }
-
-
-
-
-
-
-
-
-
index a250f9ababe5ea31f65899e8887c81a31a6b9143..ed6154e5bae4d54acc7b27ca5f46bf387746524b 100644 (file)
@@ -187,18 +187,3 @@ public class AFSException extends Exception
   }
   /*-----------------------------------------------------------------------*/
 }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
index 2aacb400ac01d2bc439693e091b33bb4d2f1cae4..2a138ecf6a76244108d501de68a1e3d8e411aaf5 100644 (file)
@@ -185,18 +185,3 @@ public class AFSSecurityException extends SecurityException
   }
   /*-----------------------------------------------------------------------*/
 }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
index c723bd6cb53f5bd6a0508e005db7ad1df568ef86..61aa84a07cdc913496fe3c83f9cfe2b6911e6fa2 100644 (file)
@@ -270,7 +270,7 @@ public class Cell implements java.io.Serializable
 
   /**
    * Sets all the information fields of this <code>Cell</code> object, 
-   * such as max group and user ids, to trheir most current values.
+   * such as max group and user ids, to their most current values.
    *
    * @exception AFSException  If an error occurs in the native code     
    */
@@ -310,8 +310,13 @@ public class Cell implements java.io.Serializable
         System.err.println("ERROR Cell::refreshUsers():kas (User: " 
                           + currUser.getName() + ") -> " + e.getMessage());
         authorized = false;
-        //if (org.openafs.jafs.ErrorCodes.isPermissionDenied(e.getErrorCode())) 
-       //r = 0;
+        if (org.openafs.jafs.ErrorTable.isPermissionDenied(e.getErrorCode())) {
+         // Check to see if the user has failed more than 25 times,
+         // if so it is most likely because they are not appropriately
+         // authorized to list or examine users.  May want to check for
+         // KAS admin attribute.
+         if ( r++ > 25 ) r = 0;
+       }
       }
     } 
     getKasUsersDone( iterationId );
@@ -334,8 +339,13 @@ public class Cell implements java.io.Serializable
         System.err.println("ERROR Cell::refreshUsers():pts (User: " 
                           + currUser.getName() + ") -> " + e.getMessage());
         authorized = false;
-        //if (org.openafs.jafs.ErrorCodes.isPermissionDenied(e.getErrorCode())) 
-       // r = 0;
+        if (org.openafs.jafs.ErrorTable.isPermissionDenied(e.getErrorCode())) {
+         // Check to see if the user has failed more than 25 times,
+         // if so it is most likely because they are not appropriately
+         // authorized to list or examine users.  May want to check for
+         // KAS admin attribute.
+         if ( r++ > 25 ) r = 0;
+       }
       }
     } 
     getPtsUsersDone( iterationId );
@@ -400,8 +410,10 @@ public class Cell implements java.io.Serializable
         System.err.println("ERROR Cell::refreshGroups() (Group: " 
                           + currGroup.getName() + ") -> " + e.getMessage());
         authorized = false;
-        //if (org.openafs.jafs.ErrorCodes.isPermissionDenied(e.getErrorCode())) 
-       // r = 0;
+        if (org.openafs.jafs.ErrorTable.isPermissionDenied(e.getErrorCode())) {
+         if ( r++ > 25 ) r = 0;
+       }
+
       }
     } 
     Cell.getGroupsDone( iterationId );
@@ -456,8 +468,9 @@ System.out.println("[Java] Cell::refreshServers() -> r: " + r);
         System.err.println("ERROR Cell::refreshServers() (Server: " 
                           + currServer.getName() + ") -> " + e.getMessage());
         authorized = false;
-        //if (e.getErrorCode() == org.openafs.jafs.ErrorCodes.PERMISSION_DENIED) 
-        // r = 0;
+        if (org.openafs.jafs.ErrorTable.isPermissionDenied(e.getErrorCode())) {
+         if ( r++ > 25 ) r = 0;
+       }
       }
     } 
     getServersDone( iterationId );
@@ -1864,11 +1877,3 @@ System.out.println("[Java] Cell::refreshServers() -> r: " + r);
   protected static native void closeCell( int cellHandle ) 
        throws AFSException;
 }
-
-
-
-
-
-
-
-
index 3b93345184da6938df83b856ea8e1d9de406dc1f..1572e452bc2a70e5dc421564c76dbf19fc99c238 100644 (file)
@@ -1174,7 +1174,7 @@ public class Group implements PTSEntry, Serializable, Comparable
    * <code>null</code> if there are no more members.
    *
    * @param iterationId   the iteration ID of this iteration
-   * @see getGroupMembersBegin
+   * @see #getGroupMembersBegin
    * @return the name of the next member
    * @exception AFSException   If an error occurs in the native code
    */
@@ -1188,7 +1188,7 @@ public class Group implements PTSEntry, Serializable, Comparable
    * @param cellHandle    the handle of the cell to which the users belong
    * @see Cell#getCellHandle
    * @param iterationId   the iteration ID of this iteration
-   * @see getGroupMembersBegin
+   * @see #getGroupMembersBegin
    * @param theUser   a User object to be populated with the values of the 
    *                  next user
    * @return 0 if there are no more users, != 0 otherwise
@@ -1203,7 +1203,7 @@ public class Group implements PTSEntry, Serializable, Comparable
    * Signals that the iteration is complete and will not be accessed anymore.
    *
    * @param iterationId   the iteration ID of this iteration
-   * @see getGroupMembersBegin
+   * @see #getGroupMembersBegin
    * @exception AFSException   If an error occurs in the native code
    */
   protected static native void getGroupMembersDone( int iterationId )
index ad205448a75477efb9c7bdfdc906ae6d5da576cf..7f227332022f4190769b186789034dd2c3029ba4 100644 (file)
@@ -457,11 +457,3 @@ public class Key implements Serializable, Comparable
   protected static native void reclaimKeyMemory();
 
 }
-
-
-
-
-
-
-
-
index 98b0adc088d5768fe6cfd30467c704f4176994e7..bf10c2095eaf7ec53b7afce2c8e0f6d20dee634e 100644 (file)
@@ -1041,12 +1041,3 @@ public class Partition implements Serializable, Comparable
    */
   protected static native void reclaimPartitionMemory();
 }
-
-
-
-
-
-
-
-
-
index de25385da35d067823ca1852efaf7f71a8f5206d..14466341281daf415828bc92fb58986378ead835 100644 (file)
@@ -1443,12 +1443,12 @@ public class Server implements Serializable, Comparable
    * methods as a means of identification.
    *
    * @param cellHandle    a cell handle previously returned by 
-   *                      a call to {@link #getCellHandle}
+   *                      a call to {@link Cell#getCellHandle}
    * @param serverName    the name of the server for which to retrieve 
    *                      a vos handle
    * @return a vos handle to the server
    * @exception AFSException  If an error occurs in the native code
-   * @see #getCellHandle
+   * @see Cell#getCellHandle
    */
   protected static native int getVosServerHandle( int cellHandle, 
                                                  String serverName )
@@ -1469,12 +1469,12 @@ public class Server implements Serializable, Comparable
    * as a means of identification.
    *
    * @param cellHandle    a cell handle previously returned by a call 
-   *                      to {@link #getCellHandle}
+   *                      to {@link Cell#getCellHandle}
    * @param serverName    the name of the server for which to retrieve 
    *                      a bos handle
    * @return a bos handle to the server
    * @exception AFSException  If an error occurs in the native code
-   * @see #getCellHandle
+   * @see Cell#getCellHandle
    */
   protected static native int getBosServerHandle( int cellHandle, 
                                                  String serverName )
@@ -1735,7 +1735,7 @@ public class Server implements Serializable, Comparable
    * are no more admins, != 0 otherwise.
    *
    * @param cellHandle    the handle of the cell to which these admins belong
-   * @see #getCellHandle
+   * @see Cell#getCellHandle
    * @param iterationId   the iteration ID of this iteration
    * @see #getBosAdminsBegin
    * @param theUser   the user object in which to fill the values of this admin
@@ -1787,7 +1787,7 @@ public class Server implements Serializable, Comparable
    * Salvages (restores consistency to) a volume, partition, or server
    *
    * @param cellHandle    the handle of the cell to which the volume belongs
-   * @see #getCellHandle
+   * @see Cell#getCellHandle
    * @param serverHandle  the bos handle of the server on which the 
    *                      volume resides
    * @see #getBosServerHandle
@@ -1831,7 +1831,7 @@ public class Server implements Serializable, Comparable
    *  Synchronizes a particular server with the volume location database.
    *
    * @param cellHandle    the handle of the cell to which the server belongs
-   * @see #getCellHandle
+   * @see Cell#getCellHandle
    * @param serverHandle  the vos handle of the server     
    * @see #getVosServerHandle
    * @param partition   the id of the partition to sync, can be -1 to ignore
@@ -1846,7 +1846,7 @@ public class Server implements Serializable, Comparable
    *  Synchronizes the volume location database with a particular server.
    *
    * @param cellHandle    the handle of the cell to which the server belongs
-   * @see #getCellHandle
+   * @see Cell#getCellHandle
    * @param serverHandle  the vos handle of the server     
    * @see #getVosServerHandle
    * @param partition   the id of the partition to sync, can be -1 to ignore
index 5fe2ef7058c6610ef02511a3976654a57c1d6580..5626a718bc47e24149e93df52e2aa62d5d82de17 100644 (file)
@@ -250,7 +250,6 @@ System.out.println(username + ", " + cellName);
   public void login() throws AFSException
   {
     this.tokenHandle = this.getToken(cellName, username, password);
-System.out.println("Token handle -> " + tokenHandle);
   }
 
   /**
index b34293feecfa5261fa6b09fabcbd36afc3de7706..5427157df6e90eb13eca60605685fbd0ca6309bb 100644 (file)
@@ -1288,7 +1288,7 @@ public class User implements PTSEntry, Serializable, Comparable
     if( (value != this.USER_OWNER_ACCESS) && 
        (value != this.USER_ANYUSER_ACCESS) ) {
        throw new IllegalArgumentException( "Cannot set listStatus to " 
-                                           + value );
+                                          + value );
     } else {
        listStatus = value;
     }
@@ -1313,7 +1313,7 @@ public class User implements PTSEntry, Serializable, Comparable
     if( (value != this.USER_OWNER_ACCESS) && 
        (value != this.USER_ANYUSER_ACCESS) ) {
        throw new IllegalArgumentException( "Cannot set listGroupsOwned to " 
-                                           + value );
+                                          + value );
     } else {
        listGroupsOwned = value;
     }
@@ -1339,7 +1339,7 @@ public class User implements PTSEntry, Serializable, Comparable
     if( (value != this.USER_OWNER_ACCESS) && 
        (value != this.USER_ANYUSER_ACCESS) ) {
        throw new IllegalArgumentException( "Cannot set listMembership to " 
-                                           + value );
+                                          + value );
     } else {
        listMembership = value;
     }
@@ -1724,7 +1724,7 @@ public class User implements PTSEntry, Serializable, Comparable
    * @exception AFSException  If an error occurs in the native code
    */
   protected static native void create( int cellHandle, String userName, 
-                                      String password, int uid )
+                                       String password, int uid )
        throws AFSException;
 
   /**
@@ -1764,7 +1764,7 @@ public class User implements PTSEntry, Serializable, Comparable
    * @exception AFSException   If an error occurs in the native code
    */
   protected static native void getUserInfo( int cellHandle, String name, 
-                                           User user ) 
+                                            User user ) 
        throws AFSException;
 
   /**
@@ -1779,7 +1779,7 @@ public class User implements PTSEntry, Serializable, Comparable
    * @exception AFSException   If an error occurs in the native code
    */
   protected static native void setUserInfo( int cellHandle, String name, 
-                                           User theUser ) 
+                                            User theUser ) 
        throws AFSException;
 
   /**
@@ -1793,7 +1793,7 @@ public class User implements PTSEntry, Serializable, Comparable
    * @exception AFSException   If an error occurs in the native code
    */
   protected static native void rename( int cellHandle, String oldName, 
-                                      String newName )
+                                       String newName )
        throws AFSException;
 
   /**
@@ -1806,7 +1806,7 @@ public class User implements PTSEntry, Serializable, Comparable
    * @exception AFSException   If an error occurs in the native code
    */
   protected static native void setPassword( int cellHandle, String userName, 
-                                           String newPassword )
+                                            String newPassword )
        throws AFSException;
 
   /**
@@ -1828,7 +1828,7 @@ public class User implements PTSEntry, Serializable, Comparable
    * <code>null</code> if there are no more groups.
    *
    * @param iterationId   the iteration ID of this iteration
-   * @see getUserGroupsBegin
+   * @see #getUserGroupsBegin
    * @return the name of the next group
    * @exception AFSException   If an error occurs in the native code
    */
@@ -1842,22 +1842,22 @@ public class User implements PTSEntry, Serializable, Comparable
    * @param cellHandle    the handle of the cell to which the users belong
    * @see Cell#getCellHandle
    * @param iterationId   the iteration ID of this iteration
-   * @see getUserGroupsBegin
+   * @see #getUserGroupsBegin
    * @param theGroup   a Group object to be populated with the values of the 
    *                   next group
    * @return 0 if there are no more users, != 0 otherwise
    * @exception AFSException  If an error occurs in the native code
    */
   protected static native int getUserGroupsNext( int cellHandle, 
-                                                int iterationId, 
-                                                Group theGroup )
+                                                 int iterationId, 
+                                                 Group theGroup )
     throws AFSException;
 
   /**
    * Signals that the iteration is complete and will not be accessed anymore.
    *
    * @param iterationId   the iteration ID of this iteration
-   * @see getUserGroupsBegin
+   * @see #getUserGroupsBegin
    * @exception AFSException   If an error occurs in the native code
    */
   protected static native void getUserGroupsDone( int iterationId )
@@ -1887,7 +1887,7 @@ public class User implements PTSEntry, Serializable, Comparable
    * @exception AFSException   If an error occurs in the native code
    */
   protected static native int getGroupsOwnedBegin( int cellHandle, 
-                                                  String name )
+                                                   String name )
        throws AFSException;
 
   /**
@@ -1895,7 +1895,7 @@ public class User implements PTSEntry, Serializable, Comparable
    * if there are no more groups.
    *
    * @param iterationId   the iteration ID of this iteration
-   * @see getGroupsOwnedBegin
+   * @see #getGroupsOwnedBegin
    * @return the name of the next group
    * @exception AFSException   If an error occurs in the native code
    */
@@ -1909,22 +1909,22 @@ public class User implements PTSEntry, Serializable, Comparable
    * @param cellHandle    the handle of the cell to which the users belong
    * @see Cell#getCellHandle
    * @param iterationId   the iteration ID of this iteration
-   * @see getGroupsOwnedBegin
+   * @see #getGroupsOwnedBegin
    * @param theGroup   a Group object to be populated with the values of the 
    *                   next group
    * @return 0 if there are no more users, != 0 otherwise
    * @exception AFSException  If an error occurs in the native code
    */
   protected static native int getGroupsOwnedNext( int cellHandle, 
-                                                 int iterationId, 
-                                                 Group theGroup )
+                                                                 int iterationId, 
+                                                         Group theGroup )
     throws AFSException;
 
   /**
    * Signals that the iteration is complete and will not be accessed anymore.
    *
    * @param iterationId   the iteration ID of this iteration
-   * @see getGroupsOwnedBegin
+   * @see #getGroupsOwnedBegin
    * @exception AFSException   If an error occurs in the native code
    */
   protected static native void getGroupsOwnedDone( int iterationId )
@@ -1937,12 +1937,3 @@ public class User implements PTSEntry, Serializable, Comparable
    */
   protected static native void reclaimUserMemory();
 }
-
-
-
-
-
-
-
-
-
index 88cf7de73bd1eeffaac45721dd91437f72a20921..85fe4ca2b082f58d045f3589b71504e4a3124130 100644 (file)
@@ -315,7 +315,7 @@ public class Volume implements Serializable, Comparable
   protected void refreshInfo() throws AFSException
   {
     getVolumeInfo( cell.getCellHandle(), server.getVosHandle(), 
-                  partition.getID(), getID(), this );
+                   partition.getID(), getID(), this );
     cachedInfo = true;
     creationDateCal = null;
     lastUpdateDateCal = null;
@@ -333,7 +333,7 @@ public class Volume implements Serializable, Comparable
   public void create( int quota ) throws AFSException
   {
     id = create( cell.getCellHandle(), server.getVosHandle(), 
-                partition.getID(), name, quota );
+                 partition.getID(), name, quota );
     maxQuota = quota;
   }
 
@@ -366,7 +366,7 @@ public class Volume implements Serializable, Comparable
   {
     Server siteServer = sitePartition.getServer();
     createReadOnlyVolume( cell.getCellHandle(), siteServer.getVosHandle(), 
-                         sitePartition.getID(), getID() );
+                          sitePartition.getID(), getID() );
     release( false );
     return new Volume( name + ".readonly", sitePartition );
   }
@@ -379,7 +379,7 @@ public class Volume implements Serializable, Comparable
   public void delete() throws AFSException
   {
     delete( cell.getCellHandle(), server.getVosHandle(), partition.getID(), 
-           getID() );
+            getID() );
     name = null;
     creationDateCal = null;
     lastUpdateDateCal = null;
@@ -434,7 +434,7 @@ public class Volume implements Serializable, Comparable
       startTime = (int) ((dumpSince.getTime().getTime())/((long) 1000));
     }
     dump( cell.getCellHandle(), server.getVosHandle(), partition.getID(), 
-         getID(), startTime, fileName );
+          getID(), startTime, fileName );
   }
 
   /**
@@ -485,7 +485,7 @@ public class Volume implements Serializable, Comparable
       throws AFSException
   {
     restore( cell.getCellHandle(), server.getVosHandle(), partition.getID(), 
-            id, name, fileName, incremental );
+             id, name, fileName, incremental );
   }
 
   /**
@@ -541,7 +541,7 @@ public class Volume implements Serializable, Comparable
   {
     Server newServer = newPartition.getServer();
     move( cell.getCellHandle(), server.getVosHandle(), partition.getID(), 
-         newServer.getVosHandle(), newPartition.getID(), getID() );
+          newServer.getVosHandle(), newPartition.getID(), getID() );
 
     server = newServer;
     partition = newPartition;
@@ -568,8 +568,8 @@ public class Volume implements Serializable, Comparable
   public void salvage() throws AFSException
   {
     Server.salvage( cell.getCellHandle(), server.getBosHandle(), 
-                   partition.getName(), name, 4, null, null, false, false, 
-                   false, false, false, false );
+                    partition.getName(), name, 4, null, null, false, false, 
+                    false, false, false, false );
   }
 
   /**
@@ -598,7 +598,7 @@ public class Volume implements Serializable, Comparable
     throws AFSException
   {
     Cell.createMountPoint( cell.getCellHandle(), directory, getName(), 
-                          readWrite, false ); 
+                           readWrite, false ); 
   }
 
   //////////////// accessors:  ////////////////////////
@@ -847,7 +847,7 @@ public class Volume implements Serializable, Comparable
     if ( !cachedInfo ) refreshInfo();
     if (maxQuota == 0) {
       throw new AFSException("Volume with id " + id + 
-                                  " has an unlimited quota configured.", 0);
+                             " has an unlimited quota configured.", 0);
     }
     return maxQuota;
   }
@@ -954,7 +954,7 @@ public class Volume implements Serializable, Comparable
   public void setQuota( int quota ) throws AFSException
   {
     this.changeQuota( cell.getCellHandle(), server.getVosHandle(), 
-                     partition.getID(), getID(), quota );
+                      partition.getID(), getID(), quota );
     maxQuota = quota;
   }
 
@@ -1097,8 +1097,8 @@ public class Volume implements Serializable, Comparable
    * @exception AFSException   If an error occurs in the native code
    */
   protected static native void getVolumeInfo( int cellHandle, int serverHandle,
-                                             int partition, int volId, 
-                                             Volume theVolume ) 
+                                              int partition, int volId, 
+                                              Volume theVolume ) 
        throws AFSException;
 
   /**
@@ -1117,8 +1117,8 @@ public class Volume implements Serializable, Comparable
    * @exception AFSException   If an error occurs in the native code
    */
   protected static native int create( int cellHandle, int serverHandle, 
-                                     int partition, String volumeName, 
-                                     int quota ) 
+                                      int partition, String volumeName, 
+                                      int quota ) 
        throws AFSException;
 
   /**
@@ -1135,7 +1135,7 @@ public class Volume implements Serializable, Comparable
    * @exception AFSException   If an error occurs in the native code
    */
   protected static native void delete( int cellHandle, int serverHandle, 
-                                      int partition, int volId ) 
+                                       int partition, int volId ) 
        throws AFSException;
 
   /**
@@ -1162,8 +1162,8 @@ public class Volume implements Serializable, Comparable
    * @see Cell#getCellHandle
    */
   protected static native void createReadOnlyVolume( int cellHandle, 
-                                                    int serverHandle, 
-                                                    int partition, int volId )
+                                                     int serverHandle, 
+                                                     int partition, int volId )
        throws AFSException;
 
   /**
@@ -1180,8 +1180,8 @@ public class Volume implements Serializable, Comparable
    * @see Cell#getCellHandle
    */
   protected static native void deleteReadOnlyVolume( int cellHandle, 
-                                                    int serverHandle, 
-                                                    int partition, int volId )
+                                                     int serverHandle, 
+                                                     int partition, int volId )
        throws AFSException;
 
   /**
@@ -1199,8 +1199,8 @@ public class Volume implements Serializable, Comparable
    * @exception AFSException   If an error occurs in the native code
    */
   protected static native void changeQuota( int cellHandle, int serverHandle, 
-                                           int partition, int volId, 
-                                           int newQuota ) 
+                                            int partition, int volId, 
+                                            int newQuota ) 
        throws AFSException;
 
   /**
@@ -1221,8 +1221,8 @@ public class Volume implements Serializable, Comparable
    * @exception AFSException   If an error occurs in the native code
    */
   protected static native void move( int cellHandle, int fromServerHandle, 
-                                    int fromPartition, int toServerHandle, 
-                                    int toPartition, int volId ) 
+                                     int fromPartition, int toServerHandle, 
+                                     int toPartition, int volId ) 
        throws AFSException;
 
   /**
@@ -1234,7 +1234,7 @@ public class Volume implements Serializable, Comparable
    * @see Cell#getCellHandle
    */
   protected static native void release( int cellHandle, int volId, 
-                                       boolean forceComplete )
+                                        boolean forceComplete )
        throws AFSException;
 
   /**
@@ -1254,8 +1254,8 @@ public class Volume implements Serializable, Comparable
    * @exception AFSException   If an error occurs in the native code
    */
   protected static native void dump( int cellHandle, int serverHandle, 
-                                    int partition, int volId, int startTime, 
-                                    String dumpFile ) 
+                                     int partition, int volId, int startTime, 
+                                     String dumpFile ) 
        throws AFSException;
 
   /**
@@ -1278,9 +1278,9 @@ public class Volume implements Serializable, Comparable
    * @exception AFSException   If an error occurs in the native code
    */
   protected static native void restore( int cellHandle, int serverHandle, 
-                                       int partition, int volId, 
-                                       String volumeName, String dumpFile, 
-                                       boolean incremental ) 
+                                        int partition, int volId, 
+                                        String volumeName, String dumpFile, 
+                                        boolean incremental ) 
        throws AFSException;
 
   /**
@@ -1293,7 +1293,7 @@ public class Volume implements Serializable, Comparable
    * @exception AFSException   If an error occurs in the native code
    */
   protected static native void rename( int cellHandle, int volId, 
-                                      String newVolumeName ) 
+                                       String newVolumeName ) 
        throws AFSException;
 
   /**
@@ -1312,8 +1312,8 @@ public class Volume implements Serializable, Comparable
    * @exception AFSException   If an error occurs in the native code
    */
   protected static native void mount( int serverHandle, int partition, 
-                                     int volId, int sleepTime, 
-                                     boolean offline ) 
+                                      int volId, int sleepTime, 
+                                      boolean offline ) 
        throws AFSException;
 
   /**
@@ -1328,7 +1328,7 @@ public class Volume implements Serializable, Comparable
    * @exception AFSException   If an error occurs in the native code
    */
   protected static native void unmount( int serverHandle, int partition, 
-                                       int volId ) 
+                                        int volId ) 
        throws AFSException;
 
   /**
@@ -1369,7 +1369,7 @@ public class Volume implements Serializable, Comparable
    * @exception AFSException  If an error occurs in the native code
    */
   protected static native int translateNameToID( int cellHandle, String name, 
-                                                int volumeType )
+                                                 int volumeType )
     throws AFSException;
 
   /**
@@ -1379,16 +1379,3 @@ public class Volume implements Serializable, Comparable
    */
   protected static native void reclaimVolumeMemory();
 }
-
-
-
-
-
-
-
-
-
-
-
-
-
index 7770bb667a4ef95276dd23be1c741d3aea3024f2..d54887ca2f4fe908d4ee7fd5167121b8686a2d9e 100644 (file)
  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
+#include <afs/param.h>
+#include <afs/stds.h>
+
 #include "Internal.h"
 #include "org_openafs_jafs_ACL.h"
 
-#include <errno.h>
 #include <stdio.h>
 #include <sys/ioctl.h>
 #include <afs/vice.h>
 #include <afs/venus.h>
 #include <afs/afs_args.h>
-#include <afs/afs_osi.h>
+
+/*
+  #include <afs/afs_osi.h>
+*/
+
+/* just for debugging */
+#define MAXHOSTS  13
+#define OMAXHOSTS 8
+#define MAXNAME   100
+#define MAXSIZE        2048
+#define MAXINSIZE 1300    /* pioctl complains if data is larger than this */
+#define VMSGSIZE  128      /* size of msg buf in volume hdr */
+
+static char space[MAXSIZE];
 
 #ifdef DMALLOC
 #include "dmalloc.h"
@@ -49,8 +64,11 @@ char* getACL(char *path)
     struct ViceIoctl params;
     char *buffer;
 
-    params.in = NULL;
-    params.in_size = 0;
+    params.in  = NULL;
+    params.out = NULL;
+    params.in_size  = 0; 
+    params.out_size = 0;
+    
     buffer = (char*) malloc(ACL_LEN);
 
     if (!buffer) {
@@ -61,9 +79,9 @@ char* getACL(char *path)
     params.out = buffer;
     params.out_size = ACL_LEN; 
 
-    if(call_syscall(AFSCALL_PIOCTL, path, VIOCGETAL, &params, 1)) {
+    if ( call_syscall(AFSCALL_PIOCTL, path, VIOCGETAL, &params, 1, 0) ) {
       fprintf(stderr, "ERROR: ACL::getACL -> VIOCGETAL failed: %d\n", errno);
-      free(buffer);
+      free( buffer );
       return NULL;
     }
 
@@ -88,7 +106,7 @@ jboolean setACL(char *path, char *aclString)
     params.out = NULL;
     params.out_size = 0;
 
-    if(call_syscall(AFSCALL_PIOCTL, path, VIOCSETAL, &params, 1)) {
+    if ( call_syscall(AFSCALL_PIOCTL, path, VIOCGETAL, &params, 1) ) {
       fprintf(stderr, "ERROR: ACL::setACL -> VIOCSETAL failed: %d\n", errno);
       return JNI_FALSE;
     }
@@ -112,21 +130,20 @@ JNIEXPORT jstring JNICALL Java_org_openafs_jafs_ACL_getACLString
     char *path, *acl;
     jstring answer = NULL;
 
-    path = (char*) (*env)->GetStringUTFChars(env, pathUTF, 0);
-
-    if(path == NULL) {
+    path = getNativeString(env, pathUTF);
+    if ( path == NULL ) {
       fprintf(stderr, "ERROR: ACL::getACLString ->");
-      fprintf(stderr, "GetStringUTFChars() returned path = NULL\n");
-      throwMessageException( env, "Path is NULL" ); 
+      fprintf(stderr, "path = NULL\n");
+      throwAFSException( env, JAFSNULLPATH ); 
       return NULL;
     }
 
-    acl = getACL(path);
-    (*env)->ReleaseStringUTFChars(env, pathUTF, path);
+    acl = getACL( path );
+    free( path );
 
-    if(acl) {
-      answer =  (*env) -> NewStringUTF(env, acl);
-      free(acl);
+    if ( acl ) {
+      answer = (*env)->NewStringUTF( env, acl );
+      free( acl );
     } else {
       throwAFSException( env, errno );
     }
@@ -151,42 +168,45 @@ JNIEXPORT void JNICALL Java_org_openafs_jafs_ACL_setACLString
 {
     char *path, *aclString;
 
-    if(!pathUTF) {
+    if ( pathUTF == NULL ) {
       fprintf(stderr, "ERROR: ACL::setACLString -> pathUTF == NULL\n");
-      throwMessageException( env, "pathUTF == NULL" );
+      throwAFSException( env, JAFSNULLPATH );
       return;
     }
 
-    path = (char*) (*env)->GetStringUTFChars(env, pathUTF, 0);
-
-    if(path == NULL) {
-      fprintf(stderr, "ERROR: ACL::setACLString -> failed to get path\n");
-      throwMessageException( env, "Failed to get path" );
+    if ( aclStringUTF == NULL ) {
+      fprintf(stderr, "ERROR: ACL::setACLString -> aclStringUTF == NULL\n");
+      throwAFSException( env, JAFSNULLACL );
       return;
     }
 
-    if(!aclStringUTF) {
-      fprintf(stderr, "ERROR: ACL::setACLString -> aclStringUTF == NULL\n");
-      throwMessageException( env, "aclStringUTF == NULL" ); 
+    /* path = (char*) (*env)->GetStringUTFChars(env, pathUTF, 0); */
+    path = getNativeString( env, pathUTF );
+    if ( path == NULL ) {
+      fprintf(stderr, "ERROR: ACL::setACLString -> failed to get path\n");
+      throwMessageException( env, "Failed to get path." );
       return;
     }
 
-    aclString = (char*) (*env)->GetStringUTFChars(env, aclStringUTF, 0);
-
-    if(aclString == NULL) {
+    /* aclString = (char*) (*env)->GetStringUTFChars(env, aclStringUTF, 0); */
+    aclString = getNativeString( env, aclStringUTF );
+    if ( aclString == NULL ) {
+      free( path );
       fprintf(stderr, "ERROR: ACL::setACLString -> failed to get aclString\n");
-      (*env)->ReleaseStringUTFChars(env, pathUTF, path);
-      throwMessageException( env, "aclString == NULL" ); 
+      throwMessageException( env, "Failed to get ACL string." ); 
       return;
     }
 
-    if (!setACL(path, aclString)) {
+    if ( !setACL(path, aclString) ) {
       throwAFSException( env, errno );
     }
 
+    /* Clean up */
+    free( path );
+    free( aclString );
+
+    /*
     (*env)->ReleaseStringUTFChars(env, pathUTF, path);
     (*env)->ReleaseStringUTFChars(env, aclStringUTF, aclString);
+    */
 }
-
-
-
index b1d33585158ee85ee3862c7102c0367a2d8f06c1..bc446dfd14d37ca395268eb4c5a8bb3cc4f2ec18 100644 (file)
@@ -42,7 +42,7 @@ JNIEXPORT void JNICALL
 Java_org_openafs_jafs_Token_initializeAdminClient(JNIEnv *env, jclass cls)
 {
   afs_status_t ast;
-  if( !afsclient_Init( &ast ) ) {
+  if ( !afsclient_Init( &ast ) ) {
     throwAFSException( env, ast );
     return;
   }
@@ -66,67 +66,59 @@ Java_org_openafs_jafs_Token_getToken
    jstring jpassword)
 {
   afs_status_t ast;
-  const char *cellName;
-  const char *userName;
-  const char *password;
+  char *cellName;
+  char *userName;
+  char *password;
   void *tokenHandle;
   int rc;
 
   // convert java strings
-  if( jcellName != NULL ) { 
-      cellName = (*env)->GetStringUTFChars(env, jcellName, 0);
-      if( !cellName ) {
-         throwAFSException( env, JAFSADMNOMEM );
-         return 0;    
-      }
+  if ( jcellName != NULL ) { 
+    cellName = getNativeString(env, jcellName);
+    if ( !cellName ) {
+      throwAFSException( env, JAFSADMNOMEM );
+      return 0;    
+    }
   } else {
-      cellName = NULL;
+    cellName = NULL;
   }
-  if( juserName != NULL ) {
-      userName = (*env)->GetStringUTFChars(env, juserName, 0);
-      if( !userName ) {
-         throwAFSException( env, JAFSADMNOMEM );
-         return 0;    
-      }
+
+  if ( juserName != NULL ) {
+    userName = getNativeString(env, juserName);
+    if ( !userName ) {
+      if ( cellName != NULL ) free( cellName );
+      throwAFSException( env, JAFSADMNOMEM );
+      return 0;    
+    }
   } else {
-      userName = NULL;
+    if ( cellName != NULL ) free( cellName );
+    throwAFSException( env, JAFSNULLUSER );
+    return 0;
   }
-  if( jpassword != NULL ) {
-      password = (*env)->GetStringUTFChars(env, jpassword, 0);
-      if( !password ) {
-         throwAFSException( env, JAFSADMNOMEM );
-         return 0;    
-      }
+
+  if ( jpassword != NULL ) {
+    password = getNativeString(env, jpassword);
+    if ( !password ) {
+      if ( cellName != NULL ) free( cellName );
+      free( userName );
+      throwAFSException( env, JAFSADMNOMEM );
+      return 0;    
+    }
   } else {
-      password = NULL;
+    if ( cellName != NULL ) free( cellName );
+    free( userName );
+    throwAFSException( env, JAFSNULLPASS );
+    return 0;
   }
 
   if ( !(afsclient_TokenGetNew( cellName, userName, password, &tokenHandle, 
-                               &ast) ) ) {
-    // release converted strings
-      if( cellName != NULL ) {
-         (*env)->ReleaseStringUTFChars(env, jcellName, cellName);
-      }
-      if( userName != NULL ) {
-         (*env)->ReleaseStringUTFChars(env, juserName, userName);
-      }
-      if( password != NULL ) {
-         (*env)->ReleaseStringUTFChars(env, jpassword, password);
-      }
-      throwAFSException( env, ast );
-      return 0;
+                                &ast) ) ) {
+    throwAFSException( env, ast );
   }
 
-  // release converted strings
-  if( cellName != NULL ) {
-      (*env)->ReleaseStringUTFChars(env, jcellName, cellName);
-  }
-  if( userName != NULL ) {
-      (*env)->ReleaseStringUTFChars(env, juserName, userName);
-  }
-  if( password != NULL ) {
-      (*env)->ReleaseStringUTFChars(env, jpassword, password);
-  }
+  if ( cellName != NULL ) free( cellName );
+  free( userName );
+  free( password );
 
   return (jint) tokenHandle;
 }
@@ -142,12 +134,12 @@ JNIEXPORT void JNICALL
 Java_org_openafs_jafs_Token_close
   (JNIEnv *env, jobject obj, jint tokenHandle)
 {
-    afs_status_t ast;
+  afs_status_t ast;
 
-    if( !afsclient_TokenClose( (void *) tokenHandle, &ast ) ) {
-      throwAFSException( env, ast );
-      return;
-    }
+  if ( !afsclient_TokenClose( (void *) tokenHandle, &ast ) ) {
+    throwAFSException( env, ast );
+    return;
+  }
 }
 
 /**
@@ -166,31 +158,27 @@ Java_org_openafs_jafs_Cell_getCellHandle
   (JNIEnv *env, jobject obj, jstring jcellName, jint tokenHandle)
 {
   afs_status_t ast;
-  const char *cellName;
+  char *cellName;
   void *cellHandle;
 
-  if( jcellName != NULL ) {
-    cellName = (*env)->GetStringUTFChars(env, jcellName, 0);
-    if( !cellName ) {
+  if ( jcellName != NULL ) {
+    cellName = getNativeString(env, jcellName);
+    if ( !cellName ) {
        throwAFSException( env, JAFSADMNOMEM );
-       return;    
+       return -1;
     }
   } else {
-    cellName = NULL;
+    throwAFSException( env, JAFSNULLCELL );
+    return -1;
   }
 
-  if( !afsclient_CellOpen( cellName, (void *) tokenHandle, 
+  if ( !afsclient_CellOpen( cellName, (void *) tokenHandle, 
                           &cellHandle, &ast ) ) {
-    if( cellName != NULL ) {
-      (*env)->ReleaseStringUTFChars(env, jcellName, cellName);
-    }  
     throwAFSException( env, ast );
-    return;
   }
 
-  if( cellName != NULL ) {
-      (*env)->ReleaseStringUTFChars(env, jcellName, cellName);
-  }  
+  free( cellName );
+
   return (jint) cellHandle;
 }
 
@@ -202,17 +190,15 @@ Java_org_openafs_jafs_Cell_getCellHandle
  * cellHandle   the cell handle to close
  */
 JNIEXPORT void JNICALL 
-Java_org_openafs_jafs_Cell_closeCell (JNIEnv *env, jobject obj, 
-                                         jint cellHandle)
+Java_org_openafs_jafs_Cell_closeCell 
+  (JNIEnv *env, jobject obj, jint cellHandle)
 {
+  afs_status_t ast;
 
-   afs_status_t ast;
-
-    if( !afsclient_CellClose( (void *) cellHandle, &ast ) ) {
-      throwAFSException( env, ast );
-      return;
-    }
-
+  if ( !afsclient_CellClose( (void *) cellHandle, &ast ) ) {
+    throwAFSException( env, ast );
+    return;
+  }
 }
 
 /**
@@ -234,32 +220,26 @@ Java_org_openafs_jafs_Server_getVosServerHandle
 {
   afs_status_t ast;
   void *serverHandle;
-  // convert java string
-  const char *serverName;
-
-  if( jserverName != NULL ) {
-      serverName = (*env)->GetStringUTFChars(env, jserverName, 0);
-      if( !serverName ) {
-         throwAFSException( env, JAFSADMNOMEM );
-         return;    
-      }
+  char *serverName;
+
+  if ( jserverName != NULL ) {
+    serverName = getNativeString(env, jserverName);
+    if ( !serverName ) {
+      throwAFSException( env, JAFSADMNOMEM );
+      return -1;
+    }
   } else {
-      serverName = NULL;
+    throwAFSException( env, JAFSNULLSERVER );
+    return -1;
   }
 
-  if( !vos_ServerOpen( (void *) cellHandle, serverName, 
-                      (void **) &serverHandle, &ast ) ) {
-      if( serverName != NULL ) {
-         (*env)->ReleaseStringUTFChars(env, jserverName, serverName);
-      }
-      throwAFSException( env, ast );
-      return 0;
+  if ( !vos_ServerOpen( (void *) cellHandle, serverName, 
+                       (void **) &serverHandle, &ast ) ) {
+    throwAFSException( env, ast );
   }
 
   // release converted string
-  if( serverName != NULL ) {
-      (*env)->ReleaseStringUTFChars(env, jserverName, serverName);
-  }
+  free( serverName );
 
   return (jint) serverHandle;
 }
@@ -275,12 +255,12 @@ JNIEXPORT void JNICALL
 Java_org_openafs_jafs_Server_closeVosServerHandle
   (JNIEnv *env, jobject obj, jint vosServerHandle)
 {
-    afs_status_t ast;
+  afs_status_t ast;
 
-    if( !vos_ServerClose( (void *) vosServerHandle, &ast ) ) {
-      throwAFSException( env, ast );
-      return;
-    }
+  if ( !vos_ServerClose( (void *) vosServerHandle, &ast ) ) {
+    throwAFSException( env, ast );
+    return;
+  }
 }
 
 /**
@@ -302,32 +282,26 @@ Java_org_openafs_jafs_Server_getBosServerHandle
 {
   afs_status_t ast;
   void *serverHandle;
-  // convert java string
-  const char *serverName;
-
-  if( jserverName != NULL ) {
-      serverName = (*env)->GetStringUTFChars(env, jserverName, 0);
-      if( !serverName ) {
-         throwAFSException( env, JAFSADMNOMEM );
-         return;    
-      }
+  char *serverName;
+
+  if ( jserverName != NULL ) {
+    serverName = getNativeString(env, jserverName);
+    if ( !serverName ) {
+      throwAFSException( env, JAFSADMNOMEM );
+      return;
+    }
   } else {
-      serverName = NULL;
+    throwAFSException( env, JAFSNULLSERVER );
+    return;
   }
 
-  if( !bos_ServerOpen( (void *) cellHandle, serverName, 
-                      (void **) &serverHandle, &ast ) ) {
-      if( serverName != NULL ) {
-         (*env)->ReleaseStringUTFChars(env, jserverName, serverName);
-      }
-      throwAFSException( env, ast );
-      return 0;
+  if ( !bos_ServerOpen( (void *) cellHandle, serverName, 
+                       (void **) &serverHandle, &ast ) ) {
+    throwAFSException( env, ast );
   }
 
   // release converted string
-  if( serverName != NULL ) {
-      (*env)->ReleaseStringUTFChars(env, jserverName, serverName);
-  }
+  free( serverName );
 
   return (jint) serverHandle;
 }
@@ -343,12 +317,12 @@ JNIEXPORT void JNICALL
 Java_org_openafs_jafs_Server_closeBosServerHandle
   (JNIEnv *env, jobject obj, jint bosServerHandle)
 {
-    afs_status_t ast;
+  afs_status_t ast;
 
-    if( !bos_ServerClose( (void *) bosServerHandle, &ast ) ) {
-      throwAFSException( env, ast );
-      return;
-    }
+  if ( !bos_ServerClose( (void *) bosServerHandle, &ast ) ) {
+    throwAFSException( env, ast );
+    return;
+  }
 }
 
 /**
@@ -365,41 +339,37 @@ JNIEXPORT jlong JNICALL
 Java_org_openafs_jafs_Token_getExpiration
   (JNIEnv *env, jobject obj, jint tokenHandle)
 {
-    afs_status_t ast;
-    unsigned long expTime;
-    char *prince = malloc( sizeof(char)*KAS_MAX_NAME_LEN ); 
-    char *inst = malloc( sizeof(char)*KAS_MAX_NAME_LEN );    
-    char *cell = malloc( sizeof(char)*AFS_MAX_SERVER_NAME_LEN );    
-    int hkt;
-
-    if( !prince || !inst || !cell ) {
-      if( prince ) {
-        free( prince );
-      }
-      if( inst ) {
-        free( inst );
-      }
-      if( cell ) {
-        free( cell );
-      }
-      throwAFSException( env, JAFSADMNOMEM );
-      return;    
+  afs_status_t ast;
+  unsigned long expTime;
+  char *prince = malloc( sizeof(char)*KAS_MAX_NAME_LEN ); 
+  char *inst   = malloc( sizeof(char)*KAS_MAX_NAME_LEN );    
+  char *cell   = malloc( sizeof(char)*AFS_MAX_SERVER_NAME_LEN );    
+  int hkt;
+
+  if ( !prince || !inst || !cell ) {
+    if ( prince ) {
+      free( prince );
     }
-
-    if( !afsclient_TokenQuery( (void *) tokenHandle, &expTime, prince, inst, 
-                              cell, &hkt, &ast ) ) {
-       free( prince );
-       free( inst );
-       free( cell );
-       throwAFSException( env, ast );
-       return 0;
+    if ( inst ) {
+      free( inst );
+    }
+    if ( cell ) {
+      free( cell );
     }
+    throwAFSException( env, JAFSADMNOMEM );
+    return;    
+  }
 
-    free( prince );
-    free( inst );
-    free( cell );
+  if ( !afsclient_TokenQuery( (void *) tokenHandle, &expTime, prince, inst, 
+                             cell, &hkt, &ast ) ) {
+    throwAFSException( env, ast );
+  }
+
+  free( prince );
+  free( inst );
+  free( cell );
 
-    return (jlong) expTime;
+  return (jlong) expTime;
 }
 
 // reclaim global memory used by this portion
@@ -407,9 +377,3 @@ JNIEXPORT void JNICALL
 Java_org_openafs_jafs_Token_reclaimAuthMemory (JNIEnv *env, jclass cls)
 {
 }
-
-
-
-
-
-
index 47bb0df9d67ade139e9236a0a0366d6d074d3c98..aafbfe6c61b36f72404bffba83bd801af674f4d8 100644 (file)
@@ -33,8 +33,9 @@
 #include <afs_AdminClientErrors.h>
 #include <afs_AdminCommonErrors.h>
 
-//// definitions in Internal.c  //////////////////
-
+/*-----------------------------------------------------------------------
+ * Definitions in Internal.c
+ */
 extern jclass userCls;
 //extern jfieldID user_cellHandleField;
 extern jfieldID user_nameField;
@@ -49,28 +50,26 @@ extern jclass serverCls;
 //extern jfieldID server_cellHandleField;
 extern jfieldID server_cachedInfoField;
 
-//////////////////////////////////////////////////////////
-
-///// definition in jafs_User.c /////////////////
-
+/*-----------------------------------------------------------------------
+ * Definition in User.c
+ */
 extern void getUserInfoChar (JNIEnv *env, int cellHandle, const char *name, 
                             jobject user);
 
-///////////////////////////////////////////////////
-
-///// definition in jafs_Group.c /////////////////
-
+/*-----------------------------------------------------------------------
+ * Definition in Group.c
+ */
 extern void getGroupInfoChar (JNIEnv *env, int cellHandle, const char *name, 
                              jobject group);
 
-///////////////////////////////////////////////////
-
-///// definition in jafs_Server.c /////////////////
-
+/*-----------------------------------------------------------------------
+ * Definition in Server.c
+ */
 extern void fillServerInfo (JNIEnv *env, jint cellHandle, jobject server, 
                            afs_serverEntry_t servEntry);
 
-///////////////////////////////////////////////////
+
+/*-----------------------------------------------------------------------*/
 
 /**
  * Returns the total number of KAS users belonging to the cell denoted
@@ -82,15 +81,15 @@ extern void fillServerInfo (JNIEnv *env, jint cellHandle, jobject server,
  *  returns total count of KAS users
  */
 JNIEXPORT jint JNICALL 
-Java_org_openafs_jafs_Cell_getKasUserCount (JNIEnv *env, jclass cls, 
-                                              jint cellHandle) {
-
+Java_org_openafs_jafs_Cell_getKasUserCount 
+  (JNIEnv *env, jclass cls, jint cellHandle) 
+{
   afs_status_t ast;
   void *iterationId;
   kas_identity_t who;
   int i = 0;
 
-  if( !kas_PrincipalGetBegin( (void *) cellHandle, NULL, 
+  if ( !kas_PrincipalGetBegin( (void *) cellHandle, NULL, 
                              &iterationId, &ast ) ) {
     throwAFSException( env, ast );
     return -1;
@@ -98,7 +97,7 @@ Java_org_openafs_jafs_Cell_getKasUserCount (JNIEnv *env, jclass cls,
 
   while ( kas_PrincipalGetNext( (void *) iterationId, &who, &ast ) ) i++;
 
-  if( ast != ADMITERATORDONE ) {
+  if ( ast != ADMITERATORDONE ) {
     throwAFSException( env, ast );
     return -1;
   }
@@ -119,20 +118,19 @@ Java_org_openafs_jafs_Cell_getKasUserCount (JNIEnv *env, jclass cls,
  *  returns an iteration ID
  */
 JNIEXPORT jint JNICALL 
-Java_org_openafs_jafs_Cell_getKasUsersBegin (JNIEnv *env, jclass cls, 
-                                               jint cellHandle) {
-
+Java_org_openafs_jafs_Cell_getKasUsersBegin 
+  (JNIEnv *env, jclass cls, jint cellHandle)
+{
   afs_status_t ast;
   void *iterationId;
 
-  if( !kas_PrincipalGetBegin( (void *) cellHandle, NULL, &iterationId, 
+  if ( !kas_PrincipalGetBegin( (void *) cellHandle, NULL, &iterationId, 
                              &ast ) ) {
     throwAFSException( env, ast );
     return;
   }
 
   return (jint) iterationId;
-
 }
 
 /**
@@ -149,24 +147,23 @@ Java_org_openafs_jafs_Cell_getKasUsersBegin (JNIEnv *env, jclass cls,
  *  returns an iteration ID
  */
 JNIEXPORT jint JNICALL 
-Java_org_openafs_jafs_Cell_getKasUsersBeginAt (JNIEnv *env, jclass cls, 
-                                                 jint cellHandle, 
-                                                 jint startIndex) {
-
+Java_org_openafs_jafs_Cell_getKasUsersBeginAt 
+  (JNIEnv *env, jclass cls, jint cellHandle, jint startIndex)
+{
   afs_status_t ast;
   void *iterationId;
   kas_identity_t who;
   int i;
 
-  if( !kas_PrincipalGetBegin( (void *) cellHandle, NULL, 
+  if ( !kas_PrincipalGetBegin( (void *) cellHandle, NULL, 
                              &iterationId, &ast ) ) {
     throwAFSException( env, ast );
     return;
   }
 
   for ( i = 1; i < startIndex; i++) {
-    if( !kas_PrincipalGetNext( (void *) iterationId, &who, &ast ) ) {
-      if( ast == ADMITERATORDONE ) {
+    if ( !kas_PrincipalGetNext( (void *) iterationId, &who, &ast ) ) {
+      if ( ast == ADMITERATORDONE ) {
         return 0;
       } else {
         throwAFSException( env, ast );
@@ -176,7 +173,6 @@ Java_org_openafs_jafs_Cell_getKasUsersBeginAt (JNIEnv *env, jclass cls,
   }
 
   return (jint) iterationId;
-
 }
 
 /**
@@ -190,15 +186,15 @@ Java_org_openafs_jafs_Cell_getKasUsersBeginAt (JNIEnv *env, jclass cls,
  *  returns the name of the next user of the cell
  */
 JNIEXPORT jstring JNICALL 
-Java_org_openafs_jafs_Cell_getKasUsersNextString (JNIEnv *env, jclass cls, 
-                                                    jint iterationId) {
-
+Java_org_openafs_jafs_Cell_getKasUsersNextString 
+  (JNIEnv *env, jclass cls, jint iterationId)
+{
   afs_status_t ast;
   kas_identity_t who;
   jstring juser;
 
-  if( !kas_PrincipalGetNext( (void *) iterationId, &who, &ast ) ) {
-    if( ast == ADMITERATORDONE ) {
+  if ( !kas_PrincipalGetNext( (void *) iterationId, &who, &ast ) ) {
+    if ( ast == ADMITERATORDONE ) {
        return NULL;
     // other
     } else {
@@ -207,11 +203,11 @@ Java_org_openafs_jafs_Cell_getKasUsersNextString (JNIEnv *env, jclass cls,
     }    
   }
 
-  if( strcmp( who.instance, "" ) ) {
+  if ( strcmp( who.instance, "" ) ) {
     char *fullName = (char *) malloc( sizeof(char)*( strlen( who.principal ) 
                                                     + strlen( who.instance ) 
                                                     + 2 ) );
-    if( !fullName ) {
+    if ( !fullName ) {
       throwAFSException( env, JAFSADMNOMEM );
       return;    
     }
@@ -242,10 +238,10 @@ Java_org_openafs_jafs_Cell_getKasUsersNextString (JNIEnv *env, jclass cls,
  *  returns 0 if there are no more users, != 0 otherwise
  */
 JNIEXPORT jint JNICALL 
-Java_org_openafs_jafs_Cell_getKasUsersNext (JNIEnv *env, jclass cls, 
-                                              jint cellHandle
-                                              jint iterationId, 
-                                              jobject juserObject) {
+Java_org_openafs_jafs_Cell_getKasUsersNext 
+  (JNIEnv *env, jclass cls, jint cellHandle, jint iterationId
+   jobject juserObject)
+{
 
   afs_status_t ast;
   kas_identity_t who;
@@ -253,8 +249,8 @@ Java_org_openafs_jafs_Cell_getKasUsersNext (JNIEnv *env, jclass cls,
   char *fullName = NULL;
 
 
-  if( !kas_PrincipalGetNext( (void *) iterationId, &who, &ast ) ) {
-    if( ast == ADMITERATORDONE ) {
+  if ( !kas_PrincipalGetNext( (void *) iterationId, &who, &ast ) ) {
+    if ( ast == ADMITERATORDONE ) {
        return 0;
     // other
     } else {
@@ -264,10 +260,10 @@ Java_org_openafs_jafs_Cell_getKasUsersNext (JNIEnv *env, jclass cls,
   }
 
   // take care of the instance stuff(by concatenating with a period in between)
-  if( strcmp( who.instance, "" ) ) {
+  if ( strcmp( who.instance, "" ) ) {
     fullName = (char *) malloc( sizeof(char)*( strlen( who.principal ) + 
                                               strlen( who.instance ) + 2 ) );
-    if( !fullName ) {
+    if ( !fullName ) {
       throwAFSException( env, JAFSADMNOMEM );
       return;    
     }
@@ -280,13 +276,13 @@ Java_org_openafs_jafs_Cell_getKasUsersNext (JNIEnv *env, jclass cls,
     juser = (*env)->NewStringUTF(env, who.principal);
   }
 
-  if( userCls == 0 ) {
+  if ( userCls == 0 ) {
     internal_getUserClass( env, juserObject );
   }
 
   (*env)->SetObjectField(env, juserObject, user_nameField, juser);
 
-  if( fullName != NULL ) { 
+  if ( fullName != NULL ) { 
       getUserInfoChar( env, (int) cellHandle, fullName, juserObject );
       free( fullName );
   } else {
@@ -306,12 +302,12 @@ Java_org_openafs_jafs_Cell_getKasUsersNext (JNIEnv *env, jclass cls,
  *  iterationId   the iteration ID of this iteration
  */
 JNIEXPORT void JNICALL 
-Java_org_openafs_jafs_Cell_getKasUsersDone (JNIEnv *env, jclass cls, 
-                                              jint iterationId) {
-
+Java_org_openafs_jafs_Cell_getKasUsersDone 
+  (JNIEnv *env, jclass cls, jint iterationId)
+{
   afs_status_t ast;
 
-  if( !kas_PrincipalGetDone( (void *) iterationId, &ast ) ) {
+  if ( !kas_PrincipalGetDone( (void *) iterationId, &ast ) ) {
     throwAFSException( env, ast );
     return;
   }
@@ -327,14 +323,14 @@ Java_org_openafs_jafs_Cell_getKasUsersDone (JNIEnv *env, jclass cls,
  *  returns the name of the cell
  */
 JNIEXPORT jstring JNICALL 
-Java_org_openafs_jafs_Cell_getCellName (JNIEnv *env, jclass cls, 
-                                          jint cellHandle) {
-
+Java_org_openafs_jafs_Cell_getCellName 
+  (JNIEnv *env, jclass cls, jint cellHandle)
+{
   afs_status_t ast;
   char *cellName;
   jstring jcellName;
 
-  if( !afsclient_CellNameGet( (void *) cellHandle, 
+  if ( !afsclient_CellNameGet( (void *) cellHandle, 
                              (const char **) &cellName, &ast ) ) {
     throwAFSException( env, ast );
     return;
@@ -356,22 +352,22 @@ Java_org_openafs_jafs_Cell_getCellName (JNIEnv *env, jclass cls,
  *  returns total number of PTS users
  */
 JNIEXPORT jint JNICALL 
-Java_org_openafs_jafs_Cell_getPtsUserCount (JNIEnv *env, jclass cls, 
-                                              jint cellHandle) {
-
+Java_org_openafs_jafs_Cell_getPtsUserCount 
+  (JNIEnv *env, jclass cls, jint cellHandle)
+{
   afs_status_t ast;
   void *iterationId;
   char *userName;
   int i = 0;
 
-  if( !pts_UserListBegin( (void *) cellHandle, &iterationId, &ast ) ) {
+  if ( !pts_UserListBegin( (void *) cellHandle, &iterationId, &ast ) ) {
     throwAFSException( env, ast );
     return -1;
   }
 
   userName = (char *) malloc( sizeof(char)*PTS_MAX_NAME_LEN);
 
-  if( !userName ) {
+  if ( !userName ) {
     throwAFSException( env, JAFSADMNOMEM );
     return -1;    
   }
@@ -380,7 +376,7 @@ Java_org_openafs_jafs_Cell_getPtsUserCount (JNIEnv *env, jclass cls,
 
   free( userName );
 
-  if( ast != ADMITERATORDONE ) {
+  if ( ast != ADMITERATORDONE ) {
     throwAFSException( env, ast );
     return -1;
   }
@@ -398,9 +394,9 @@ Java_org_openafs_jafs_Cell_getPtsUserCount (JNIEnv *env, jclass cls,
  *  returns total number of users that are in PTS and not KAS
  */
 JNIEXPORT jint JNICALL 
-Java_org_openafs_jafs_Cell_getPtsOnlyUserCount (JNIEnv *env, jclass cls, 
-                                                  jint cellHandle) {
-
+Java_org_openafs_jafs_Cell_getPtsOnlyUserCount 
+  (JNIEnv *env, jclass cls, jint cellHandle)
+{
   afs_status_t ast;
   void *iterationId;
   kas_identity_p who = (kas_identity_p) malloc( sizeof(kas_identity_t) );
@@ -408,29 +404,28 @@ Java_org_openafs_jafs_Cell_getPtsOnlyUserCount (JNIEnv *env, jclass cls,
   char *userName;
   int i = 0;
 
-  if( !who ) {
+  if ( who == NULL ) {
     throwAFSException( env, JAFSADMNOMEM );
     return -1;
   }
 
-  if( !pts_UserListBegin( (void *) cellHandle, &iterationId, &ast ) ) {
+  if ( !pts_UserListBegin( (void *) cellHandle, &iterationId, &ast ) ) {
     free( who );
     throwAFSException( env, ast );
     return -1;
   }
 
   userName = (char *) malloc( sizeof(char)*PTS_MAX_NAME_LEN);
-    
-  if( !userName ) {
+  if ( !userName ) {
     free( who );
     throwAFSException( env, JAFSADMNOMEM );
     return -1;
   }
 
   while ( pts_UserListNext( (void *) iterationId, userName, &ast ) ) {
-    if( strcmp( userName, "anonymous" ) != 0 ) {
+    if ( strcmp( userName, "anonymous" ) != 0 ) {
       // make sure the name is within the allowed bounds
-      if( strlen( userName ) > KAS_MAX_NAME_LEN ) {
+      if ( strlen( userName ) > KAS_MAX_NAME_LEN ) {
            free( who );
            free( userName );
            throwAFSException( env, ADMPTSUSERNAMETOOLONG );
@@ -439,7 +434,7 @@ Java_org_openafs_jafs_Cell_getPtsOnlyUserCount (JNIEnv *env, jclass cls,
   
       // if there is a kas entry, recurse
       internal_makeKasIdentity( userName, who );
-      if( !kas_PrincipalGet( (void *) cellHandle, NULL, who, 
+      if ( !kas_PrincipalGet( (void *) cellHandle, NULL, who, 
                             &kasEntry, &ast ) ) i++;
        }
   }
@@ -447,7 +442,7 @@ Java_org_openafs_jafs_Cell_getPtsOnlyUserCount (JNIEnv *env, jclass cls,
   free( userName );
   free( who );
 
-  if( ast != ADMITERATORDONE ) {
+  if ( ast != ADMITERATORDONE ) {
     throwAFSException( env, ast );
     return -1;
   }
@@ -467,15 +462,15 @@ Java_org_openafs_jafs_Cell_getPtsOnlyUserCount (JNIEnv *env, jclass cls,
  *  returns an iteration ID
  */
 JNIEXPORT jint JNICALL 
-Java_org_openafs_jafs_Cell_getPtsUsersBegin (JNIEnv *env, jclass cls, 
-                                               jint cellHandle) {
-
+Java_org_openafs_jafs_Cell_getPtsUsersBegin 
+  (JNIEnv *env, jclass cls, jint cellHandle)
+{
   afs_status_t ast;
   void *iterationId;
 
-  if( !pts_UserListBegin( (void *) cellHandle, &iterationId, &ast ) ) {
+  if ( !pts_UserListBegin( (void *) cellHandle, &iterationId, &ast ) ) {
     throwAFSException( env, ast );
-    return;
+    return -1;
   }
 
   return (jint) iterationId;
@@ -492,31 +487,31 @@ Java_org_openafs_jafs_Cell_getPtsUsersBegin (JNIEnv *env, jclass cls,
  *  returns the name of the next user of the cell
  */
 JNIEXPORT jstring JNICALL 
-Java_org_openafs_jafs_Cell_getPtsUsersNextString (JNIEnv *env, jclass cls, 
-                                                    jint iterationId) {
-
+Java_org_openafs_jafs_Cell_getPtsUsersNextString 
+  (JNIEnv *env, jclass cls, jint iterationId)
+{
   afs_status_t ast;
   char *userName;
   jstring juser;
 
   userName = (char *) malloc( sizeof(char)*PTS_MAX_NAME_LEN);
 
-  if( !userName ) {
+  if ( !userName ) {
     throwAFSException( env, JAFSADMNOMEM );
-    return;    
+    return NULL;
   }
 
-  if( !pts_UserListNext( (void *) iterationId, userName, &ast ) ) {
+  if ( !pts_UserListNext( (void *) iterationId, userName, &ast ) ) {
     free( userName );
-    if( ast == ADMITERATORDONE ) {
+    if ( ast == ADMITERATORDONE ) {
       return NULL;
     } else {
       throwAFSException( env, ast );
-      return;
+      return NULL;
     }
   }
 
-  if( strcmp( userName, "anonymous" ) == 0 ) {
+  if ( strcmp( userName, "anonymous" ) == 0 ) {
     free( userName );
     return Java_org_openafs_jafs_Cell_getPtsUsersNextString( env, cls, 
                                                                iterationId );
@@ -539,58 +534,56 @@ Java_org_openafs_jafs_Cell_getPtsUsersNextString (JNIEnv *env, jclass cls,
  *  returns the name of the next pts user (not kas user) of the cell
  */
 JNIEXPORT jstring JNICALL 
-Java_org_openafs_jafs_Cell_getPtsOnlyUsersNextString (JNIEnv *env, 
-                                                        jclass cls, 
-                                                        jint iterationId, 
-                                                        jint cellHandle) {
-
+Java_org_openafs_jafs_Cell_getPtsOnlyUsersNextString 
+  (JNIEnv *env, jclass cls, jint iterationId, jint cellHandle)
+{
     kas_identity_p who = (kas_identity_p) malloc( sizeof(kas_identity_t) );
     kas_principalEntry_t kasEntry;
     afs_status_t ast;
     char *userName;
     jstring juser;
 
-    if( !who ) {
+    if ( !who ) {
       throwAFSException( env, JAFSADMNOMEM );
-      return;    
+      return NULL;
     }
 
     userName = (char *) malloc( sizeof(char)*PTS_MAX_NAME_LEN);
-    
-    if( !userName ) {
+
+    if ( !userName ) {
       free( who );
       throwAFSException( env, JAFSADMNOMEM );
-      return;    
+      return NULL;
     }
 
     while( 1 ) {
 
-       if( !pts_UserListNext( (void *) iterationId, userName, &ast ) ) {
+       if ( !pts_UserListNext( (void *) iterationId, userName, &ast ) ) {
            free( userName );
            free( who );
-           if( ast == ADMITERATORDONE ) {
+           if ( ast == ADMITERATORDONE ) {
                return NULL;
            } else {
                throwAFSException( env, ast );
-               return;
+               return NULL;
            }
        }
 
-       if( strcmp( userName, "anonymous" ) == 0 ) {
+       if ( strcmp( userName, "anonymous" ) == 0 ) {
            continue;
        }
        
        // make sure the name is within the allowed bounds
-       if( strlen( userName ) > KAS_MAX_NAME_LEN ) {
+       if ( strlen( userName ) > KAS_MAX_NAME_LEN ) {
            free( who );
            free( userName );
            throwAFSException( env, ADMPTSUSERNAMETOOLONG );
-           return;
+           return NULL;
        }
        
        // if there is a kas entry, recurse
        internal_makeKasIdentity( userName, who );
-       if( kas_PrincipalGet( (void *) cellHandle, NULL, who, 
+       if ( kas_PrincipalGet( (void *) cellHandle, NULL, who, 
                              &kasEntry, &ast ) ) {
            continue;
        }
@@ -599,7 +592,6 @@ Java_org_openafs_jafs_Cell_getPtsOnlyUsersNextString (JNIEnv *env,
        free( userName );
        free( who );
        return juser;
-
     }
 
 }
@@ -617,25 +609,25 @@ Java_org_openafs_jafs_Cell_getPtsOnlyUsersNextString (JNIEnv *env,
  *  returns 0 if there are no more users, != 0 otherwise
  */
 JNIEXPORT jint JNICALL 
-Java_org_openafs_jafs_Cell_getPtsUsersNext (JNIEnv *env, jclass cls, 
-                                              jint cellHandle
-                                              jint iterationId, 
-                                              jobject juserObject ) {
-    
+Java_org_openafs_jafs_Cell_getPtsUsersNext 
+  (JNIEnv *env, jclass cls, jint cellHandle, jint iterationId
+   jobject juserObject )
+{
+   
   afs_status_t ast;
   char *userName;
   jstring juser;
 
   userName = (char *) malloc( sizeof(char)*PTS_MAX_NAME_LEN);
 
-  if( !userName ) {
+  if ( !userName ) {
     throwAFSException( env, JAFSADMNOMEM );
-    return;    
+    return 0;
   }
 
-  if( !pts_UserListNext( (void *) iterationId, userName, &ast ) ) {
+  if ( !pts_UserListNext( (void *) iterationId, userName, &ast ) ) {
     free( userName );
-    if( ast == ADMITERATORDONE ) {
+    if ( ast == ADMITERATORDONE ) {
       return 0;
     } else {
       throwAFSException( env, ast );
@@ -643,7 +635,7 @@ Java_org_openafs_jafs_Cell_getPtsUsersNext (JNIEnv *env, jclass cls,
     }
   }
 
-  if( strcmp( userName, "anonymous" ) == 0 ) {
+  if ( strcmp( userName, "anonymous" ) == 0 ) {
     free( userName );
     return Java_org_openafs_jafs_Cell_getPtsUsersNext( env, cls, 
                                                          cellHandle, 
@@ -653,7 +645,7 @@ Java_org_openafs_jafs_Cell_getPtsUsersNext (JNIEnv *env, jclass cls,
   
   juser = (*env)->NewStringUTF(env, userName);
 
-  if( userCls == 0 ) {
+  if ( userCls == 0 ) {
     internal_getUserClass( env, juserObject );
   }
 
@@ -664,7 +656,6 @@ Java_org_openafs_jafs_Cell_getPtsUsersNext (JNIEnv *env, jclass cls,
 
   free( userName );
   return 1;
-
 }
 
 /**
@@ -680,36 +671,35 @@ Java_org_openafs_jafs_Cell_getPtsUsersNext (JNIEnv *env, jclass cls,
  *  returns 0 if there are no more users, != 0 otherwise
  */
 JNIEXPORT jint JNICALL 
-Java_org_openafs_jafs_Cell_getPtsOnlyUsersNext (JNIEnv *env, jclass cls, 
-                                                  jint cellHandle, 
-                                                  jint iterationId, 
-                                                  jobject juserObject ) {
-
+Java_org_openafs_jafs_Cell_getPtsOnlyUsersNext 
+  (JNIEnv *env, jclass cls, jint cellHandle, jint iterationId, 
+   jobject juserObject )
+{
   kas_identity_p who = (kas_identity_p) malloc( sizeof(kas_identity_t) );
   kas_principalEntry_t kasEntry;
   afs_status_t ast;
   char *userName;
   jstring juser;
 
-  if( !who ) {
+  if ( !who ) {
     throwAFSException( env, JAFSADMNOMEM );
-    return;    
+    return 0;
   }
   
   userName = (char *) malloc( sizeof(char)*PTS_MAX_NAME_LEN);
 
-  if( !userName ) {
+  if ( !userName ) {
     free( who );
     throwAFSException( env, JAFSADMNOMEM );
-    return;    
+    return 0;
   }
 
   while( 1 ) {
 
-      if( !pts_UserListNext( (void *) iterationId, userName, &ast ) ) {
+      if ( !pts_UserListNext( (void *) iterationId, userName, &ast ) ) {
          free( userName );
          free( who );
-         if( ast == ADMITERATORDONE ) {
+         if ( ast == ADMITERATORDONE ) {
              return 0;
          } else {
              throwAFSException( env, ast );
@@ -717,26 +707,26 @@ Java_org_openafs_jafs_Cell_getPtsOnlyUsersNext (JNIEnv *env, jclass cls,
          }
       }
       
-      if( strcmp( userName, "anonymous" ) == 0 ) {
+      if ( strcmp( userName, "anonymous" ) == 0 ) {
          continue;
       }
       
       // make sure the name is within the allowed bounds
-      if( strlen( userName ) > KAS_MAX_NAME_LEN ) {
+      if ( strlen( userName ) > KAS_MAX_NAME_LEN ) {
          free( userName );
          free( who );
          throwAFSException( env, ADMPTSUSERNAMETOOLONG );
          return 0;
       }
       
-      if( userCls == 0 ) {
+      if ( userCls == 0 ) {
          internal_getUserClass( env, juserObject );
       }
       
       
       // if there is a kas entry, recurse
       internal_makeKasIdentity( userName, who );
-      if( kas_PrincipalGet( (void *) cellHandle, NULL, who, 
+      if ( kas_PrincipalGet( (void *) cellHandle, NULL, who, 
                            &kasEntry, &ast ) ) {
          continue;
       } 
@@ -763,12 +753,12 @@ Java_org_openafs_jafs_Cell_getPtsOnlyUsersNext (JNIEnv *env, jclass cls,
  *  iterationId   the iteration ID of this iteration
  */
 JNIEXPORT void JNICALL 
-Java_org_openafs_jafs_Cell_getPtsUsersDone (JNIEnv *env, jclass cls, 
-                                              jint iterationId) {
-
+Java_org_openafs_jafs_Cell_getPtsUsersDone 
+  (JNIEnv *env, jclass cls, jint iterationId)
+{
   afs_status_t ast;
 
-  if( !pts_UserListDone( (void *) iterationId, &ast ) ) {
+  if ( !pts_UserListDone( (void *) iterationId, &ast ) ) {
     throwAFSException( env, ast );
     return;
   }
@@ -785,22 +775,23 @@ Java_org_openafs_jafs_Cell_getPtsUsersDone (JNIEnv *env, jclass cls,
  *  returns total number of groups
  */
 JNIEXPORT jint JNICALL 
-Java_org_openafs_jafs_Cell_getGroupCount (JNIEnv *env, jclass cls, 
-                                            jint cellHandle) {
+Java_org_openafs_jafs_Cell_getGroupCount 
+  (JNIEnv *env, jclass cls, jint cellHandle)
+{
 
   afs_status_t ast;
   void *iterationId;
   char *groupName;
   int i = 0;
 
-  if( !pts_GroupListBegin( (void *) cellHandle, &iterationId, &ast ) ) {
+  if ( !pts_GroupListBegin( (void *) cellHandle, &iterationId, &ast ) ) {
     throwAFSException( env, ast );
     return -1;
   }
 
   groupName = (char *) malloc( sizeof(char)*PTS_MAX_NAME_LEN);
 
-  if( !groupName ) {
+  if ( !groupName ) {
     throwAFSException( env, JAFSADMNOMEM );
     return -1;
   }
@@ -809,7 +800,7 @@ Java_org_openafs_jafs_Cell_getGroupCount (JNIEnv *env, jclass cls,
 
   free( groupName );
 
-  if( ast != ADMITERATORDONE ) {
+  if ( ast != ADMITERATORDONE ) {
     throwAFSException( env, ast );
     return -1;
   }
@@ -829,19 +820,18 @@ Java_org_openafs_jafs_Cell_getGroupCount (JNIEnv *env, jclass cls,
  *  returns an iteration ID
  */
 JNIEXPORT jint JNICALL 
-Java_org_openafs_jafs_Cell_getGroupsBegin (JNIEnv *env, jclass cls, 
-                                             jint cellHandle) {
-
+Java_org_openafs_jafs_Cell_getGroupsBegin 
+  (JNIEnv *env, jclass cls, jint cellHandle)
+{
   afs_status_t ast;
   void *iterationId;
 
-  if( !pts_GroupListBegin( (void *) cellHandle, &iterationId, &ast ) ) {
+  if ( !pts_GroupListBegin( (void *) cellHandle, &iterationId, &ast ) ) {
     throwAFSException( env, ast );
     return;
   }
 
   return (jint) iterationId;
-
 }
 
 /**
@@ -857,10 +847,9 @@ Java_org_openafs_jafs_Cell_getGroupsBegin (JNIEnv *env, jclass cls,
  *  returns an iteration ID
  */
 JNIEXPORT jint JNICALL 
-Java_org_openafs_jafs_Cell_getGroupsBeginAt (JNIEnv *env, jclass cls, 
-                                               jint cellHandle, 
-                                               jint startIndex) {
-
+Java_org_openafs_jafs_Cell_getGroupsBeginAt 
+  (JNIEnv *env, jclass cls, jint cellHandle, jint startIndex)
+{
   afs_status_t ast;
   void *iterationId;
   char *groupName;
@@ -868,15 +857,15 @@ Java_org_openafs_jafs_Cell_getGroupsBeginAt (JNIEnv *env, jclass cls,
 
   groupName = (char *) malloc( sizeof(char)*PTS_MAX_NAME_LEN);
 
-  if( !pts_GroupListBegin( (void *) cellHandle, &iterationId, &ast ) ) {
+  if ( !pts_GroupListBegin( (void *) cellHandle, &iterationId, &ast ) ) {
     throwAFSException( env, ast );
     return 0;
   }
 
   for ( i = 1; i < startIndex; i++) {
-    if( !pts_GroupListNext( (void *) iterationId, groupName, &ast ) ) {
+    if ( !pts_GroupListNext( (void *) iterationId, groupName, &ast ) ) {
       free( groupName );
-      if( ast == ADMITERATORDONE ) {
+      if ( ast == ADMITERATORDONE ) {
         return 0;
       } else {
         throwAFSException( env, ast );
@@ -887,7 +876,6 @@ Java_org_openafs_jafs_Cell_getGroupsBeginAt (JNIEnv *env, jclass cls,
 
   free( groupName );
   return (jint) iterationId;
-
 }
 
 /**
@@ -900,27 +888,27 @@ Java_org_openafs_jafs_Cell_getGroupsBeginAt (JNIEnv *env, jclass cls,
  *  returns the name of the next user of the cell
  */
 JNIEXPORT jstring JNICALL 
-Java_org_openafs_jafs_Cell_getGroupsNextString (JNIEnv *env, jclass cls, 
-                                                  jint iterationId) {
-
+Java_org_openafs_jafs_Cell_getGroupsNextString 
+  (JNIEnv *env, jclass cls, jint iterationId)
+{
   afs_status_t ast;
   char *groupName;
   jstring jgroup;
 
   groupName = (char *) malloc( sizeof(char)*PTS_MAX_NAME_LEN);
 
-  if( !groupName ) {
+  if ( !groupName ) {
     throwAFSException( env, JAFSADMNOMEM );
-    return;    
+    return NULL;
   }
 
-  if( !pts_GroupListNext( (void *) iterationId, groupName, &ast ) ) {
+  if ( !pts_GroupListNext( (void *) iterationId, groupName, &ast ) ) {
     free( groupName );
-    if( ast == ADMITERATORDONE ) {
+    if ( ast == ADMITERATORDONE ) {
       return NULL;
     } else {
       throwAFSException( env, ast );
-      return;
+      return NULL;
     }
   }
 
@@ -943,25 +931,24 @@ Java_org_openafs_jafs_Cell_getGroupsNextString (JNIEnv *env, jclass cls,
  *  returns 0 if there are no more users, != 0 otherwise
  */
 JNIEXPORT jint JNICALL 
-Java_org_openafs_jafs_Cell_getGroupsNext (JNIEnv *env, jclass cls, 
-                                            jint cellHandle, 
-                                            jint iterationId, 
-                                            jobject jgroupObject) {
-
+Java_org_openafs_jafs_Cell_getGroupsNext 
+  (JNIEnv *env, jclass cls, jint cellHandle, jint iterationId, 
+   jobject jgroupObject)
+{
   afs_status_t ast;
   char *groupName;
   jstring jgroup;
 
   groupName = (char *) malloc( sizeof(char)*PTS_MAX_NAME_LEN );
 
-  if( !groupName ) {
+  if ( !groupName ) {
     throwAFSException( env, JAFSADMNOMEM );
-      return;    
+    return;    
   }
   
-  if( !pts_GroupListNext( (void *) iterationId, groupName, &ast ) ) {
+  if ( !pts_GroupListNext( (void *) iterationId, groupName, &ast ) ) {
     free( groupName );
-    if( ast == ADMITERATORDONE ) {
+    if ( ast == ADMITERATORDONE ) {
       return 0;
     } else {
       throwAFSException( env, ast );
@@ -971,7 +958,7 @@ Java_org_openafs_jafs_Cell_getGroupsNext (JNIEnv *env, jclass cls,
 
   jgroup = (*env)->NewStringUTF(env, groupName);
 
-  if( groupCls == 0 ) {
+  if ( groupCls == 0 ) {
     internal_getGroupClass( env, jgroupObject );
   }
 
@@ -982,7 +969,6 @@ Java_org_openafs_jafs_Cell_getGroupsNext (JNIEnv *env, jclass cls,
 
   free( groupName );
   return 1;
-
 }
 
 /**
@@ -993,16 +979,16 @@ Java_org_openafs_jafs_Cell_getGroupsNext (JNIEnv *env, jclass cls,
  *  iterationId   the iteration ID of this iteration
  */
 JNIEXPORT void JNICALL 
-Java_org_openafs_jafs_Cell_getGroupsDone (JNIEnv *env, jclass cls, 
-                                            jint iterationId) {
-
+Java_org_openafs_jafs_Cell_getGroupsDone 
+  (JNIEnv *env, jclass cls,  jint iterationId)
+{
   afs_status_t ast;
 
-  if( !pts_GroupListDone( (void *) iterationId, &ast ) ) {
+  if ( !pts_GroupListDone( (void *) iterationId, &ast ) ) {
     throwAFSException( env, ast );
     return;
   }
-  
 }
 
 /**
@@ -1016,19 +1002,18 @@ Java_org_openafs_jafs_Cell_getGroupsDone (JNIEnv *env, jclass cls,
  *  returns an integer reresenting the max group id in a cell
  */
 JNIEXPORT jint JNICALL 
-Java_org_openafs_jafs_Cell_getMaxGroupID (JNIEnv *env, jclass cls, 
-                                            jint cellHandle) {
-
+Java_org_openafs_jafs_Cell_getMaxGroupID 
+  (JNIEnv *env, jclass cls, jint cellHandle)
+{
   afs_status_t ast;
   jint maxID;
 
-  if( !pts_GroupMaxGet( (void *) cellHandle, (int *) &maxID, &ast ) ) {
+  if ( !pts_GroupMaxGet( (void *) cellHandle, (int *) &maxID, &ast ) ) {
     throwAFSException( env, ast );
-    return;
+    return 0;
   }
 
   return maxID;
-
 }
 
 /**
@@ -1041,16 +1026,15 @@ Java_org_openafs_jafs_Cell_getMaxGroupID (JNIEnv *env, jclass cls,
  *  maxID an integer reresenting the new max group id in a cell
  */
 JNIEXPORT void JNICALL 
-Java_org_openafs_jafs_Cell_setMaxGroupID (JNIEnv *env, jclass cls, 
-                                            jint cellHandle, jint maxID) {
-
+Java_org_openafs_jafs_Cell_setMaxGroupID 
+  (JNIEnv *env, jclass cls, jint cellHandle, jint maxID)
+{
   afs_status_t ast;
 
-  if( !pts_GroupMaxSet( (void *) cellHandle, (int) maxID, &ast ) ) {
+  if ( !pts_GroupMaxSet( (void *) cellHandle, (int) maxID, &ast ) ) {
     throwAFSException( env, ast );
     return;
   }
-
 }
 
 /**
@@ -1064,19 +1048,18 @@ Java_org_openafs_jafs_Cell_setMaxGroupID (JNIEnv *env, jclass cls,
  *  returns an integer reresenting the max user id in a cell
  */
 JNIEXPORT jint JNICALL 
-Java_org_openafs_jafs_Cell_getMaxUserID (JNIEnv *env, jclass cls, 
-                                           jint cellHandle) {
-
+Java_org_openafs_jafs_Cell_getMaxUserID 
+  (JNIEnv *env, jclass cls, jint cellHandle)
+{
   afs_status_t ast;
   jint maxID;
 
-  if( !pts_UserMaxGet( (void *) cellHandle, (int *) &maxID, &ast ) ) {
+  if ( !pts_UserMaxGet( (void *) cellHandle, (int *) &maxID, &ast ) ) {
     throwAFSException( env, ast );
-    return;
+    return 0;
   }
 
   return maxID;
-
 }
 
 /**
@@ -1089,16 +1072,15 @@ Java_org_openafs_jafs_Cell_getMaxUserID (JNIEnv *env, jclass cls,
  *  maxID an integer reresenting the new max user id in a cell
  */
 JNIEXPORT void JNICALL 
-Java_org_openafs_jafs_Cell_setMaxUserID (JNIEnv *env, jclass cls, 
-                                           jint cellHandle, jint maxID) {
-
+Java_org_openafs_jafs_Cell_setMaxUserID 
+  (JNIEnv *env, jclass cls, jint cellHandle, jint maxID)
+{
   afs_status_t ast;
 
-  if( !pts_UserMaxSet( (void *) cellHandle, (int) maxID, &ast ) ) {
+  if ( !pts_UserMaxSet( (void *) cellHandle, (int) maxID, &ast ) ) {
     throwAFSException( env, ast );
     return;
   }
-
 }
 
 /**
@@ -1111,15 +1093,15 @@ Java_org_openafs_jafs_Cell_setMaxUserID (JNIEnv *env, jclass cls,
  *  returns total number of servers
  */
 JNIEXPORT jint JNICALL 
-Java_org_openafs_jafs_Cell_getServerCount (JNIEnv *env, jclass cls, 
-                                             jint cellHandle) {
-
+Java_org_openafs_jafs_Cell_getServerCount 
+  (JNIEnv *env, jclass cls, jint cellHandle)
+{
   afs_status_t ast;
   void *iterationId;
   afs_serverEntry_t servEntry;
   int i = 0;
 
-  if( !afsclient_AFSServerGetBegin( (void *) cellHandle, 
+  if ( !afsclient_AFSServerGetBegin( (void *) cellHandle, 
                                    &iterationId, &ast ) ) {
     throwAFSException( env, ast );
     return -1;
@@ -1128,7 +1110,7 @@ Java_org_openafs_jafs_Cell_getServerCount (JNIEnv *env, jclass cls,
   while ( afsclient_AFSServerGetNext( (void *) iterationId, 
                                      &servEntry, &ast ) ) i++;
 
-  if( ast != ADMITERATORDONE ) {
+  if ( ast != ADMITERATORDONE ) {
     throwAFSException( env, ast );
     return -1;
   }
@@ -1147,20 +1129,19 @@ Java_org_openafs_jafs_Cell_getServerCount (JNIEnv *env, jclass cls,
  *  returns an iteration ID
  */
 JNIEXPORT jint JNICALL 
-Java_org_openafs_jafs_Cell_getServersBegin (JNIEnv *env, jclass cls, 
-                                              jint cellHandle) {
-
+Java_org_openafs_jafs_Cell_getServersBegin 
+  (JNIEnv *env, jclass cls, jint cellHandle)
+{
   afs_status_t ast;
   void *iterationId;
 
-  if( !afsclient_AFSServerGetBegin( (void *) cellHandle, 
+  if ( !afsclient_AFSServerGetBegin( (void *) cellHandle, 
                                    &iterationId, &ast ) ) {
     throwAFSException( env, ast );
-    return;
+    return -1;
   }
 
   return (jint) iterationId;
-
 }
 
 /**
@@ -1173,24 +1154,22 @@ Java_org_openafs_jafs_Cell_getServersBegin (JNIEnv *env, jclass cls,
  *  returns the name of the next server of the cell
  */
 JNIEXPORT jstring JNICALL 
-Java_org_openafs_jafs_Cell_getServersNextString (JNIEnv *env, jclass cls, 
-                                                   jint iterationId) {
-
+Java_org_openafs_jafs_Cell_getServersNextString 
+  (JNIEnv *env, jclass cls, jint iterationId)
+{
   afs_status_t ast;
   jstring jserver;
   afs_serverEntry_t servEntry;
 
-  if( !afsclient_AFSServerGetNext( (void *) iterationId, &servEntry, &ast ) ) {
-      if( ast == ADMITERATORDONE ) {
-         return NULL;
-      } else {
-         throwAFSException( env, ast );
-         return;
-      }
+  if ( !afsclient_AFSServerGetNext( (void *) iterationId, &servEntry, &ast ) ) {
+    if ( ast == ADMITERATORDONE ) {
+      return NULL;
+    } else {
+      throwAFSException( env, ast );
+      return NULL;
+    }
   }
-
   return jserver;
-
 }
 
 /**
@@ -1215,8 +1194,8 @@ Java_org_openafs_jafs_Cell_getServersNext
   afs_serverEntry_t servEntry;
   jintArray jaddress;
 
-  if( !afsclient_AFSServerGetNext( (void *) iterationId, &servEntry, &ast ) ) {
-    if( ast == ADMITERATORDONE ) {
+  if ( !afsclient_AFSServerGetNext( (void *) iterationId, &servEntry, &ast ) ) {
+    if ( ast == ADMITERATORDONE ) {
       return 0;
     } else {
       throwAFSException( env, ast );
@@ -1225,7 +1204,7 @@ Java_org_openafs_jafs_Cell_getServersNext
   }
 
   // get the class fields if need be
-  if( serverCls == 0 ) {
+  if ( serverCls == 0 ) {
     internal_getServerClass( env, jserverObject );
   }
 
@@ -1249,11 +1228,10 @@ Java_org_openafs_jafs_Cell_getServersDone
 {
   afs_status_t ast;
 
-  if( !afsclient_AFSServerGetDone( (void *) iterationId, &ast ) ) {
+  if ( !afsclient_AFSServerGetDone( (void *) iterationId, &ast ) ) {
     throwAFSException( env, ast );
     return;
   }
-
 }
 
 /**
@@ -1269,72 +1247,58 @@ Java_org_openafs_jafs_Cell_getServersDone
  *  forceCheck  whether or not to check if this volume name exists
  */
 JNIEXPORT void JNICALL 
-Java_org_openafs_jafs_Cell_createMountPoint (JNIEnv *env, jclass cls, 
-                                               jint cellHandle, 
-                                               jstring jdirectory, 
-                                               jstring jvolumeName, 
-                                               jboolean readWrite, 
-                                               jboolean forceCheck) {
-
+Java_org_openafs_jafs_Cell_createMountPoint 
+  (JNIEnv *env, jclass cls, jint cellHandle, jstring jdirectory, 
+   jstring jvolumeName, jboolean readWrite, jboolean forceCheck)
+{
   afs_status_t ast;
-  const char *directory;
-  const char *volumeName;
+  char *directory;
+  char *volumeName;
   vol_type_t type;
   vol_check_t check;
 
-  if( jdirectory != NULL ) {
-    directory = (*env)->GetStringUTFChars(env, jdirectory, 0);
-    if( !directory ) {
+  if ( jdirectory != NULL ) {
+    directory = getNativeString(env, jdirectory);
+    if ( !directory ) {
        throwAFSException( env, JAFSADMNOMEM );
        return;    
     }
   } else {
-    directory = NULL;
+    throwAFSException( env, JAFSNULLPATH );
+    return;
   }
-  if( jvolumeName != NULL ) {
-    volumeName = (*env)->GetStringUTFChars(env, jvolumeName, 0);
-    if( !volumeName ) {
-      if( directory != NULL ) {
-       (*env)->ReleaseStringUTFChars(env, jdirectory, directory);
-      }
+  if ( jvolumeName != NULL ) {
+    volumeName = getNativeString(env, jvolumeName);
+    if ( volumeName == NULL ) {
+      free( directory );
       throwAFSException( env, JAFSADMNOMEM );
       return;    
     }
   } else {
-    volumeName = NULL;
+    free( directory );
+    throwAFSException( env, JAFSNULLVOLUME );
+    return;
   }
 
-  if( readWrite ) {
+  if ( readWrite ) {
     type = READ_WRITE;
   } else {
     type = READ_ONLY;
   }
 
-  if( forceCheck ) {
+  if ( forceCheck ) {
     check = CHECK_VOLUME;
   } else {
     check = DONT_CHECK_VOLUME;
   }
 
-  if( !afsclient_MountPointCreate( (void *) cellHandle, directory, 
+  if ( !afsclient_MountPointCreate( (void *) cellHandle, directory, 
                                   volumeName, type, check, &ast ) ) {
-    if( volumeName != NULL ) {
-      (*env)->ReleaseStringUTFChars(env, jvolumeName, volumeName);
-    }
-    if( directory != NULL ) {
-      (*env)->ReleaseStringUTFChars(env, jdirectory, directory);
-    }
     throwAFSException( env, ast );
-    return;
-  }
-
-  if( volumeName != NULL ) {
-    (*env)->ReleaseStringUTFChars(env, jvolumeName, volumeName);
-  }
-  if( directory != NULL ) {
-    (*env)->ReleaseStringUTFChars(env, jdirectory, directory);
   }
 
+  free( directory );
+  free( volumeName );
 }
 
 /*
@@ -1354,132 +1318,97 @@ Java_org_openafs_jafs_Cell_createMountPoint (JNIEnv *env, jclass cls,
  *  admin    whether or not to allow admin access to this user
  */
 JNIEXPORT void JNICALL 
-Java_org_openafs_jafs_Cell_setACL (JNIEnv *env, jclass cls, 
-                                     jstring jdirectory, jstring juserName, 
-                                     jboolean read, jboolean write, 
-                                     jboolean lookup, jboolean delete, 
-                                     jboolean insert, jboolean lock, 
-                                     jboolean admin) {
-
+Java_org_openafs_jafs_Cell_setACL 
+  (JNIEnv *env, jclass cls, jstring jdirectory, jstring juserName, 
+   jboolean read, jboolean write, jboolean lookup, jboolean delete, 
+   jboolean insert, jboolean lock, jboolean admin)
+{
   afs_status_t ast;
-  const char *directory;
-  const char *userName;
+  char *directory;
+  char *userName;
   acl_t acl;
 
-  // Added by MP
-  if( !afsclient_Init( &ast ) ) {
+  if ( !afsclient_Init( &ast ) ) {
     throwAFSException( env, ast );
     return;
   }
 
-  if( jdirectory != NULL ) {
-    directory = (*env)->GetStringUTFChars(env, jdirectory, 0);
-    if( !directory ) {
+  if ( jdirectory != NULL ) {
+    directory = getNativeString(env, jdirectory);
+    if ( !directory ) {
        throwAFSException( env, JAFSADMNOMEM );
        return;    
     }
   } else {
-    directory = NULL;
+    throwAFSException( env, JAFSNULLPATH );
+    return;
   }
-  if( juserName != NULL ) {
-    userName = (*env)->GetStringUTFChars(env, juserName, 0);
-    if( !userName ) {
-      if( directory != NULL ) {
-       (*env)->ReleaseStringUTFChars(env, jdirectory, directory);
-      }
+
+  if ( juserName != NULL ) {
+    userName = getNativeString(env, juserName);
+    if ( !userName ) {
+      free( directory );
       throwAFSException( env, JAFSADMNOMEM );
       return;    
     }
   } else {
-    userName = NULL;
+    free( directory );
+    throwAFSException( env, JAFSNULLUSER );
+    return;
   }
 
-  if( read ) {
+  if ( read ) {
     acl.read = READ;
   } else {
     acl.read = NO_READ;
   }
 
-  if( write ) {
+  if ( write ) {
     acl.write = WRITE;
   } else {
     acl.write = NO_WRITE;
   }
 
-  if( lookup ) {
+  if ( lookup ) {
     acl.lookup = LOOKUP;
   } else {
     acl.lookup = NO_LOOKUP;
   }
 
-  if( delete ) {
+  if ( delete ) {
     acl.del = DELETE;
   } else {
     acl.del = NO_DELETE;
   }
 
-  if( insert ) {
+  if ( insert ) {
     acl.insert = INSERT;
   } else {
     acl.insert = NO_INSERT;
   }
 
-  if( lock ) {
+  if ( lock ) {
     acl.lock = LOCK;
   } else {
     acl.lock = NO_LOCK;
   }
 
-  if( admin ) {
+  if ( admin ) {
     acl.admin = ADMIN;
   } else {
     acl.admin = NO_ADMIN;
   }
 
-  if( !afsclient_ACLEntryAdd( directory, userName, &acl, &ast ) ) {
-      if( userName != NULL ) {
-       (*env)->ReleaseStringUTFChars(env, juserName, userName);
-      }
-      if( directory != NULL ) {
-       (*env)->ReleaseStringUTFChars(env, jdirectory, directory);
-      }
-      throwAFSException( env, ast );
-      return;
-  }
-
-  if( userName != NULL ) {
-    (*env)->ReleaseStringUTFChars(env, juserName, userName);
-  }
-  if( directory != NULL ) {
-    (*env)->ReleaseStringUTFChars(env, jdirectory, directory);
+  if ( !afsclient_ACLEntryAdd( directory, userName, &acl, &ast ) ) {
+    throwAFSException( env, ast );
   }
 
+  free( userName );
+  free( directory );
 }
 
 // reclaim global memory used by this portion
 JNIEXPORT void JNICALL 
-Java_org_openafs_jafs_Cell_reclaimCellMemory (JNIEnv *env, jclass cls) {
-
+Java_org_openafs_jafs_Cell_reclaimCellMemory (JNIEnv *env, jclass cls)
+{
 }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
index 4adcfd06dd20de7470bc16654a1174e53c98cdbc..b2f563b862a968b1be2df19cac408ef420db69f3 100644 (file)
  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
+#if 0
+#include <afs/param.h>
+#include <errno.h>
+#endif
+
 #include "Internal.h"
 #include "org_openafs_jafs_File.h"
 
@@ -76,28 +81,34 @@ char* getAbsolutePath(JNIEnv *env, jobject *obj, char *dirName)
     jclass thisClass;
     jstring jDirName;
     jmethodID getAbsolutePathID;
-    const char *auxDirName;
+    char *auxDirName;
     jfieldID fid;
 
     thisClass = (*env)->GetObjectClass(env, *obj);
-    if(thisClass == NULL) {
+    if( thisClass == NULL ) {
       fprintf(stderr, "File::getAbsolutePath(): GetObjectClass failed\n");
       return NULL;
     }
+
     fid = (*env)->GetFieldID(env, thisClass, "path", "Ljava/lang/String;");
-    if (fid == 0) {
+    if ( fid == NULL ) {
       fprintf(stderr, "File::getAbsolutePath(): GetFieldID (path) failed\n");
       return NULL;
     }
-    jDirName = (*env)->GetObjectField(env, *obj, fid);
 
-    if(jDirName == NULL) {
+    jDirName = (*env)->GetObjectField(env, *obj, fid);
+    if( jDirName == NULL ) {
       fprintf(stderr, "File::getAbsolutePath(): failed to get file name\n");
       return NULL;
     }
-    auxDirName = (*env) -> GetStringUTFChars(env, jDirName, 0);
+
+    auxDirName = getNativeString(env, jDirName);
+    if ( auxDirName == NULL ) {
+      fprintf(stderr, "File::getAbsolutePath(): failed to get translated file name\n");
+      return NULL;
+    }
     strcpy(dirName, auxDirName);
-    (*env) -> ReleaseStringUTFChars(env, jDirName, auxDirName);
+    free( auxDirName );
 }
 
 /**
@@ -464,8 +475,9 @@ JNIEXPORT jboolean JNICALL Java_org_openafs_jafs_File_closeDir
   if (rc < 0) {
     setError(env, &obj, errno);
     return JNI_FALSE;
+  } else {
+    return JNI_TRUE;
   }
-  else return JNI_TRUE;
 }
 
 
@@ -636,8 +648,7 @@ void setFileNotExistsAttributes
     fid = (*env)->GetFieldID(env, thisClass, "isDirectory", "Z");
     if (fid == 0) {
       fprintf(stderr, 
-            "File::setFileNotExistsAttributes(): GetFieldID (isDirectory) 
-             failed\n");
+            "File::setFileNotExistsAttributes(): GetFieldID (isDirectory) failed\n");
       return;
     }
     (*env)->SetBooleanField(env, *obj, fid, JNI_FALSE);
@@ -645,8 +656,7 @@ void setFileNotExistsAttributes
     fid = (*env)->GetFieldID(env, thisClass, "isFile", "Z");
     if (fid == 0) {
       fprintf(stderr, 
-            "File::setFileNotExistsAttributes(): GetFieldID (isDirectory) 
-             failed\n");
+            "File::setFileNotExistsAttributes(): GetFieldID (isDirectory) failed\n");
       return;
     }
     (*env)->SetBooleanField(env, *obj, fid, JNI_FALSE);
@@ -670,5 +680,3 @@ void setFileNotExistsAttributes
 
     return;
 }
-
-
index 95b9327dd2660d939f1737c215fecb44fa5bc921..7c1b7fc873d84eb067c569d467e2b9698db6f088 100644 (file)
@@ -33,7 +33,7 @@ extern int errno;
 /**
  * Be carefull with the memory management:
  *
- * - For every GetStringUTFChars call the corresponding ReleaseStringUTFChars.
+ * - For every getNativeString call the corresponding free().
  * - For every Get<type>ArrayElements call the corresponding
  *   Release<type>ArrayElements
  * - For every malloc call the corresponding free.
@@ -91,13 +91,13 @@ JNIEXPORT jint JNICALL Java_org_openafs_jafs_FileInputStream_read
   jfieldID fid;
 
   /* If we have to read 0 bytes just return */
-  if(length == 0) return 0;
+  if (length == 0) return 0;
 
   thisClass = (*env)->GetObjectClass(env, obj);
   fid = (*env)->GetFieldID(env, thisClass, "fileDescriptor", "I");
   fd = (*env)->GetIntField(env, obj, fid);
 
-  if(fd < 0) {
+  if (fd < 0) {
     fprintf(stderr, "FileInputStream::read(): invalid file state\n");
     throwAFSFileException(env, 0, "Invalid file state");
     return -1;
@@ -136,7 +136,7 @@ JNIEXPORT void JNICALL Java_org_openafs_jafs_FileInputStream_close
   fid = (*env)->GetFieldID(env, thisClass, "fileDescriptor", "I");
   fd = (*env)->GetIntField(env, obj, fid);
 
-  if(fd < 0) {
+  if (fd < 0) {
     fprintf(stderr, "FileInputStream::close(): invalid file state\n");
     throwAFSFileException(env, 0, "Invalid file state");
     return;
@@ -148,6 +148,3 @@ JNIEXPORT void JNICALL Java_org_openafs_jafs_FileInputStream_close
     throwAFSFileException(env, errno, NULL);
   }
 }
-
-
-
index ed3e617f1144f00c2afb6d7a431e6a26be256403..effd823603e6b63c868b1aeaab4133ec83dab4bb 100644 (file)
  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
+#include <afs/param.h>
+#include <errno.h>
+
 #include "Internal.h"
 #include "org_openafs_jafs_FileOutputStream.h"
 
 #include <stdio.h>
 #include <fcntl.h>
-#include <afs/afs_usrops.h>
+/*#include <afs/afs_usrops.h>*/
 
 #ifdef DMALLOC
 #include "dmalloc.h"
@@ -33,7 +36,7 @@
 /**
  * Be carefull with the memory management:
  *
- * - For every GetStringUTFChars call the corresponding ReleaseStringUTFChars.
+ * - For every getNativeString call the corresponding free().
  * - For every Get<type>ArrayElements call the corresponding
  *   Release<type>ArrayElements
  * - For every malloc call the corresponding free.
@@ -104,40 +107,43 @@ JNIEXPORT jint JNICALL Java_org_openafs_jafs_FileOutputStream_openAppend
 JNIEXPORT void JNICALL Java_org_openafs_jafs_FileOutputStream_write
   (JNIEnv *env, jobject obj, jbyteArray jbytes, jint offset, jint length)
 {
-    int fd, written, toWrite;
-    jint twritten;
-    jclass thisClass;
-    jmethodID getFileDescriptorID;
-    char *bytes;
-    jfieldID fid;
-
-    thisClass = (*env)->GetObjectClass(env, obj);
-    fid = (*env)->GetFieldID(env, thisClass, "fileDescriptor", "I");
-    fd = (*env)->GetIntField(env, obj, fid);
-    if(fd < 0) {
-      fprintf(stderr, "FileOutputStream::write(): failed to get file 
+  int fd, written, toWrite;
+  jint twritten;
+  jclass thisClass;
+  jmethodID getFileDescriptorID;
+  char *bytes;
+  jfieldID fid;
+
+  thisClass = (*env)->GetObjectClass(env, obj);
+  fid = (*env)->GetFieldID(env, thisClass, "fileDescriptor", "I");
+  fd = (*env)->GetIntField(env, obj, fid);
+  if(fd < 0) {
+    fprintf(stderr, "FileOutputStream::write(): failed to get file 
                        descriptor\n");
-      throwAFSFileException(env, 0, "Failed to get file descriptor!");
-    }
-    bytes = (char*) malloc(length);
-    if(bytes == NULL) {
-      fprintf(stderr, "FileOutputStream::write(): malloc failed of %d bytes\n",
-                       length);
-      throwAFSFileException(env, 0, "Failed to allocate memory!");
-    }
-    (*env) -> GetByteArrayRegion(env, jbytes, offset, length, bytes);
-    toWrite = length;
-    twritten = 0;
-    while(toWrite>0) {
-      written = uafs_write(fd, bytes, length);
-      twritten += written;
-      if(written<0) {
-        free(bytes);
-        throwAFSFileException(env, errno, NULL);
-      }
-      toWrite -= written;
+    throwAFSFileException(env, 0, "Failed to get file descriptor!");
+  }
+
+  bytes = (char*) malloc(length);
+  if(bytes == NULL) {
+    fprintf(stderr, "FileOutputStream::write(): malloc failed of %d bytes\n",
+            length);
+    throwAFSFileException(env, 0, "Failed to allocate memory!");
+  }
+
+  (*env) -> GetByteArrayRegion(env, jbytes, offset, length, bytes);
+  toWrite = length;
+  twritten = 0;
+
+  while( toWrite > 0 ) {
+    written = uafs_write(fd, bytes, length);
+    twritten += written;
+    if( written < 0 ) {
+      free(bytes);
+      throwAFSFileException(env, errno, NULL);
     }
-    free(bytes);
+    toWrite -= written;
+  }
+  free(bytes);
 }
 
 /**
@@ -153,23 +159,21 @@ JNIEXPORT void JNICALL Java_org_openafs_jafs_FileOutputStream_write
 JNIEXPORT void JNICALL Java_org_openafs_jafs_FileOutputStream_close
   (JNIEnv *env, jobject obj)
 {
-    int fd, rc;
-    jclass thisClass;
-    jmethodID getFileDescriptorID;
-    char *bytes;
-    jfieldID fid;
-
-    thisClass = (*env)->GetObjectClass(env, obj);
-    fid = (*env)->GetFieldID(env, thisClass, "fileDescriptor", "I");
-    fd = (*env)->GetIntField(env, obj, fid);
-    if(fd < 0) {
-      fprintf(stderr, "FileOutputStream::close(): failed to get file descriptor\n");
-      throwAFSFileException(env, 0, "Failed to get file descriptor!");
-    }
-    rc = uafs_close(fd);
-    if (rc != 0) {
-      throwAFSFileException(env, rc, NULL);
-    }
-}
-
+  int fd, rc;
+  jclass thisClass;
+  jmethodID getFileDescriptorID;
+  char *bytes;
+  jfieldID fid;
 
+  thisClass = (*env)->GetObjectClass(env, obj);
+  fid = (*env)->GetFieldID(env, thisClass, "fileDescriptor", "I");
+  fd  = (*env)->GetIntField(env, obj, fid);
+  if(fd < 0) {
+    fprintf(stderr, "FileOutputStream::close(): failed to get file descriptor\n");
+    throwAFSFileException(env, 0, "Failed to get file descriptor!");
+  }
+  rc = uafs_close(fd);
+  if (rc != 0) {
+    throwAFSFileException(env, rc, NULL);
+  }
+}
index 7b944ffc27968261231bdc8c12b0d76cb1d45c6f..b314d920aa3ae61985cc2a5fbabf38d64434086f 100644 (file)
@@ -72,63 +72,54 @@ Java_org_openafs_jafs_Group_create
 {
   afs_status_t ast;
   // convert java strings
-  const char *groupName;
-  const char *ownerName;
+  char *groupName;
+  char *ownerName;
 
-  if( jgroupName != NULL ) {
-    groupName = (*env)->GetStringUTFChars(env, jgroupName, 0);
-    if( !groupName ) {
+  if ( jgroupName != NULL ) {
+    groupName = getNativeString(env, jgroupName);
+    if ( groupName == NULL ) {
        throwAFSException( env, JAFSADMNOMEM );
        return;    
     }
   } else {
-    groupName = NULL;
+    throwAFSException( env, JAFSNULLGROUP );
+    return;    
   }
 
-  if( jownerName != NULL ) {
-    ownerName = (*env)->GetStringUTFChars(env, jownerName, 0);
-    if( !ownerName ) {
+  if ( jownerName != NULL ) {
+    ownerName = getNativeString(env, jownerName);
+    if ( ownerName == NULL ) {
+      free( groupName );
        throwAFSException( env, JAFSADMNOMEM );
        return;    
     }
   } else {
-    ownerName = NULL;
+    free( groupName );
+    throwAFSException( env, JAFSNULLOWNER );
+    return;
   }
 
   // make sure the name is within the allowed bounds
-  if( groupName != NULL && strlen( groupName ) > PTS_MAX_NAME_LEN ) {
+  if ( strlen( groupName ) > PTS_MAX_NAME_LEN ) {
     // release converted java strings
-    if( groupName != NULL ) {
-      (*env)->ReleaseStringUTFChars(env, jgroupName, groupName);
-    }
-    if( ownerName != NULL ) {
-      (*env)->ReleaseStringUTFChars(env, jownerName, ownerName);
-    }
+    free( groupName );
+    free( ownerName );
     throwAFSException( env, ADMPTSGROUPNAMETOOLONG );
     return;
   }
   
-  if( !pts_GroupCreate( (void *) cellHandle, groupName, ownerName, 
+  if ( !pts_GroupCreate( (void *) cellHandle, groupName, ownerName, 
                        (int *) &gid, &ast ) ) {
     // release converted java strings
-    if( groupName != NULL ) {
-      (*env)->ReleaseStringUTFChars(env, jgroupName, groupName);
-    }
-    if( ownerName != NULL ) {
-      (*env)->ReleaseStringUTFChars(env, jownerName, ownerName);
-    }
+    free( groupName );
+    free( ownerName );
     throwAFSException( env, ast );
     return;
   }
 
   // release converted java strings
-  if( groupName != NULL ) {
-    (*env)->ReleaseStringUTFChars(env, jgroupName, groupName);
-  }
-  if( ownerName != NULL ) {
-    (*env)->ReleaseStringUTFChars(env, jownerName, ownerName);
-  }
-
+  free( groupName );
+  free( ownerName );
 }
 
 /**
@@ -147,31 +138,25 @@ Java_org_openafs_jafs_Group_delete
 {
   afs_status_t ast;
   // convert java strings
-  const char *groupName;
+  char *groupName;
 
-  if( jgroupName != NULL ) {
-    groupName = (*env)->GetStringUTFChars(env, jgroupName, 0);
-    if( !groupName ) {
+  if ( jgroupName != NULL ) {
+    groupName = getNativeString(env, jgroupName);
+    if ( !groupName ) {
        throwAFSException( env, JAFSADMNOMEM );
        return;    
     }
   } else {
-    groupName = NULL;
+    throwAFSException( env, JAFSNULLGROUP );
+    return;
   }
 
-  if( !pts_GroupDelete( (void *) cellHandle, groupName, &ast ) ) {
-    if( groupName != NULL ) {
-      (*env)->ReleaseStringUTFChars(env, jgroupName, groupName);
-    }
+  if ( !pts_GroupDelete( (void *) cellHandle, groupName, &ast ) ) {
     throwAFSException( env, ast );
-    return;
   }
   
   // release converted java strings
-  if( groupName != NULL ) {
-    (*env)->ReleaseStringUTFChars(env, jgroupName, groupName);
-  }
-
+  free( groupName );
 }
 
 /**
@@ -192,7 +177,7 @@ void getGroupInfoChar
   pts_GroupEntry_t entry;
   afs_status_t ast;
   // get the field ids if you haven't already
-  if( groupCls == 0 ) {
+  if ( groupCls == 0 ) {
     internal_getGroupClass( env, group );
   }
 
@@ -208,10 +193,10 @@ void getGroupInfoChar
   (*env)->SetIntField(env, group, group_membershipCountField, 
                      entry.membershipCount);
 
-  if( entry.listStatus == PTS_GROUP_OWNER_ACCESS ) {
+  if ( entry.listStatus == PTS_GROUP_OWNER_ACCESS ) {
       (*env)->SetIntField(env, group, group_listStatusField, 
                          org_openafs_jafs_Group_GROUP_OWNER_ACCESS);
-  } else if( entry.listStatus == PTS_GROUP_ACCESS ) {
+  } else if ( entry.listStatus == PTS_GROUP_ACCESS ) {
       (*env)->SetIntField(env, group, group_listStatusField, 
                          org_openafs_jafs_Group_GROUP_GROUP_ACCESS);
   } else {
@@ -219,10 +204,10 @@ void getGroupInfoChar
                          org_openafs_jafs_Group_GROUP_ANYUSER_ACCESS);
   }
 
-  if( entry.listGroupsOwned == PTS_GROUP_OWNER_ACCESS ) {
+  if ( entry.listGroupsOwned == PTS_GROUP_OWNER_ACCESS ) {
       (*env)->SetIntField(env, group, group_listGroupsOwnedField, 
                          org_openafs_jafs_Group_GROUP_OWNER_ACCESS);
-  } else if( entry.listGroupsOwned == PTS_GROUP_ACCESS ) {
+  } else if ( entry.listGroupsOwned == PTS_GROUP_ACCESS ) {
       (*env)->SetIntField(env, group, group_listGroupsOwnedField, 
                          org_openafs_jafs_Group_GROUP_GROUP_ACCESS);
   } else {
@@ -230,10 +215,10 @@ void getGroupInfoChar
                          org_openafs_jafs_Group_GROUP_ANYUSER_ACCESS);
   }
 
-  if( entry.listMembership == PTS_GROUP_OWNER_ACCESS ) {
+  if ( entry.listMembership == PTS_GROUP_OWNER_ACCESS ) {
       (*env)->SetIntField(env, group, group_listMembershipField, 
                          org_openafs_jafs_Group_GROUP_OWNER_ACCESS);
-  } else if( entry.listMembership == PTS_GROUP_ACCESS ) {
+  } else if ( entry.listMembership == PTS_GROUP_ACCESS ) {
       (*env)->SetIntField(env, group, group_listMembershipField, 
                          org_openafs_jafs_Group_GROUP_GROUP_ACCESS);
   } else {
@@ -241,10 +226,10 @@ void getGroupInfoChar
                          org_openafs_jafs_Group_GROUP_ANYUSER_ACCESS);
   }
 
-  if( entry.listAdd == PTS_GROUP_OWNER_ACCESS ) {
+  if ( entry.listAdd == PTS_GROUP_OWNER_ACCESS ) {
       (*env)->SetIntField(env, group, group_listAddField, 
                          org_openafs_jafs_Group_GROUP_OWNER_ACCESS);
-  } else if( entry.listAdd == PTS_GROUP_ACCESS ) {
+  } else if ( entry.listAdd == PTS_GROUP_ACCESS ) {
       (*env)->SetIntField(env, group, group_listAddField, 
                          org_openafs_jafs_Group_GROUP_GROUP_ACCESS);
   } else {
@@ -252,10 +237,10 @@ void getGroupInfoChar
                          org_openafs_jafs_Group_GROUP_ANYUSER_ACCESS);
   }
 
-  if( entry.listDelete == PTS_GROUP_OWNER_ACCESS ) {
+  if ( entry.listDelete == PTS_GROUP_OWNER_ACCESS ) {
       (*env)->SetIntField(env, group, group_listDeleteField, 
                          org_openafs_jafs_Group_GROUP_OWNER_ACCESS);
-  } else if( entry.listDelete == PTS_GROUP_ACCESS ) {
+  } else if ( entry.listDelete == PTS_GROUP_ACCESS ) {
       (*env)->SetIntField(env, group, group_listDeleteField, 
                          org_openafs_jafs_Group_GROUP_GROUP_ACCESS);
   } else {
@@ -263,12 +248,11 @@ void getGroupInfoChar
                          org_openafs_jafs_Group_GROUP_ANYUSER_ACCESS);
   }
 
-  jowner = (*env)->NewStringUTF(env, entry.owner);
+  jowner   = (*env)->NewStringUTF(env, entry.owner);
   jcreator =  (*env)->NewStringUTF(env, entry.creator);
 
   (*env)->SetObjectField(env, group, group_ownerField, jowner);
   (*env)->SetObjectField(env, group, group_creatorField, jcreator);
-
 }
 
 /**
@@ -286,32 +270,29 @@ JNIEXPORT void JNICALL
 Java_org_openafs_jafs_Group_getGroupInfo
   (JNIEnv *env, jclass cls, jint cellHandle, jstring jname, jobject group)
 {
+  char *name;
 
-  const char *name;
-
-  if( jname != NULL ) {
-    name = (*env)->GetStringUTFChars(env, jname, 0);
-    if( !name ) {
+  if ( jname != NULL ) {
+    name = getNativeString(env, jname);
+    if ( !name ) {
        throwAFSException( env, JAFSADMNOMEM );
        return;    
     }
   } else {
-    name = NULL;
+    throwAFSException( env, JAFSNULLGROUP );
+    return;
   }
   getGroupInfoChar( env, cellHandle, name, group );
 
   // get class fields if need be
-  if( groupCls == 0 ) {
+  if ( groupCls == 0 ) {
     internal_getGroupClass( env, group );
   }
 
   // set name in case blank object
   (*env)->SetObjectField(env, group, group_nameField, jname);
 
-  if( name != NULL ) {
-    (*env)->ReleaseStringUTFChars(env, jname, name);
-  }
-
+  free( name );
 }
 
 /**
@@ -327,7 +308,7 @@ JNIEXPORT void JNICALL
 Java_org_openafs_jafs_Group_setGroupInfo
   (JNIEnv *env, jclass cls, jint cellHandle, jstring jname, jobject group)
 {
-  const char *name;
+  char *name;
   pts_GroupUpdateEntry_t ptsEntry;
   afs_status_t ast;
 
@@ -338,7 +319,7 @@ Java_org_openafs_jafs_Group_setGroupInfo
   jint jlistDelete;
 
   // get the field ids if you haven't already
-  if( groupCls == 0 ) {
+  if ( groupCls == 0 ) {
     internal_getGroupClass( env, group );
   }
 
@@ -349,65 +330,60 @@ Java_org_openafs_jafs_Group_setGroupInfo
   jlistAdd = (*env)->GetIntField(env, group, group_listAddField);
   jlistDelete = (*env)->GetIntField(env, group, group_listDeleteField);
 
-  if( jname != NULL ) {
-    name = (*env)->GetStringUTFChars(env, jname, 0);
-    if( !name ) {
+  if ( jname != NULL ) {
+    name = getNativeString(env, jname);
+    if ( name == NULL ) {
        throwAFSException( env, JAFSADMNOMEM );
        return;    
     }
   } else {
-    name = NULL;
+    throwAFSException( env, JAFSNULLGROUP );
+    return;
   }
 
-  if( jlistStatus == org_openafs_jafs_Group_GROUP_OWNER_ACCESS ) {
+  if ( jlistStatus == org_openafs_jafs_Group_GROUP_OWNER_ACCESS ) {
     ptsEntry.listStatus = PTS_GROUP_OWNER_ACCESS;
-  } else if( jlistStatus == org_openafs_jafs_Group_GROUP_GROUP_ACCESS ) {
+  } else if ( jlistStatus == org_openafs_jafs_Group_GROUP_GROUP_ACCESS ) {
     ptsEntry.listStatus = PTS_GROUP_ACCESS;
   } else {
     ptsEntry.listStatus = PTS_GROUP_ANYUSER_ACCESS;
   }
-  if( jlistGroupsOwned == org_openafs_jafs_Group_GROUP_OWNER_ACCESS ) {
+  if ( jlistGroupsOwned == org_openafs_jafs_Group_GROUP_OWNER_ACCESS ) {
     ptsEntry.listGroupsOwned = PTS_GROUP_OWNER_ACCESS;
-  } else if( jlistGroupsOwned == 
+  } else if ( jlistGroupsOwned == 
             org_openafs_jafs_Group_GROUP_GROUP_ACCESS ) {
     ptsEntry.listGroupsOwned = PTS_GROUP_ACCESS;
   } else {
     ptsEntry.listGroupsOwned = PTS_GROUP_ANYUSER_ACCESS;
   }
-  if( jlistMembership == org_openafs_jafs_Group_GROUP_OWNER_ACCESS ) {
+  if ( jlistMembership == org_openafs_jafs_Group_GROUP_OWNER_ACCESS ) {
     ptsEntry.listMembership = PTS_GROUP_OWNER_ACCESS;
-  } else if( jlistMembership == 
+  } else if ( jlistMembership == 
             org_openafs_jafs_Group_GROUP_GROUP_ACCESS ) {
     ptsEntry.listMembership = PTS_GROUP_ACCESS;
   } else {
     ptsEntry.listMembership = PTS_GROUP_ANYUSER_ACCESS;
   }
-  if( jlistAdd == org_openafs_jafs_Group_GROUP_OWNER_ACCESS ) {
+  if ( jlistAdd == org_openafs_jafs_Group_GROUP_OWNER_ACCESS ) {
     ptsEntry.listAdd = PTS_GROUP_OWNER_ACCESS;
-  } else if( jlistAdd == org_openafs_jafs_Group_GROUP_GROUP_ACCESS ) {
+  } else if ( jlistAdd == org_openafs_jafs_Group_GROUP_GROUP_ACCESS ) {
     ptsEntry.listAdd = PTS_GROUP_ACCESS;
   } else {
     ptsEntry.listAdd = PTS_GROUP_ANYUSER_ACCESS;
   }
-  if( jlistDelete == org_openafs_jafs_Group_GROUP_OWNER_ACCESS ) {
+  if ( jlistDelete == org_openafs_jafs_Group_GROUP_OWNER_ACCESS ) {
     ptsEntry.listDelete = PTS_GROUP_OWNER_ACCESS;
-  } else if( jlistDelete == org_openafs_jafs_Group_GROUP_GROUP_ACCESS ) {
+  } else if ( jlistDelete == org_openafs_jafs_Group_GROUP_GROUP_ACCESS ) {
     ptsEntry.listDelete = PTS_GROUP_ACCESS;
   } else {
     ptsEntry.listDelete = PTS_GROUP_ANYUSER_ACCESS;
   }
-  if( !pts_GroupModify( (void *) cellHandle, name, &ptsEntry, &ast ) ) {
-    if( name != NULL ) {
-      (*env)->ReleaseStringUTFChars(env, jname, name);
-    }
-    throwAFSException( env, ast );
-    return;    
-  }
 
-  if( name != NULL ) {
-    (*env)->ReleaseStringUTFChars(env, jname, name);
+  if ( !pts_GroupModify( (void *) cellHandle, name, &ptsEntry, &ast ) ) {
+    throwAFSException( env, ast );
   }
 
+  free( name );
 }
 
 /**
@@ -425,35 +401,29 @@ JNIEXPORT jint JNICALL
 Java_org_openafs_jafs_Group_getGroupMembersBegin
   (JNIEnv *env, jclass cls, jint cellHandle, jstring jname)
 {
-  const char *name;
+  char *name;
   afs_status_t ast;
   void *iterationId;
 
-  if( jname != NULL ) {
-    name = (*env)->GetStringUTFChars(env, jname, 0);
-    if( !name ) {
+  if ( jname != NULL ) {
+    name = getNativeString(env, jname);
+    if ( name == NULL ) {
        throwAFSException( env, JAFSADMNOMEM );
-       return;    
+       return 0;    
     }
   } else {
-    name = NULL;
+    throwAFSException( env, JAFSNULLGROUP );
+    return 0;
   }
 
-  if( !pts_GroupMemberListBegin( (void *) cellHandle, name, &iterationId, 
+  if ( !pts_GroupMemberListBegin( (void *) cellHandle, name, &iterationId, 
                                 &ast ) ) {
-    if( name != NULL ) {
-      (*env)->ReleaseStringUTFChars(env, jname, name);
-    }
     throwAFSException( env, ast );
-    return;
   }
 
-  if( name != NULL ) {
-    (*env)->ReleaseStringUTFChars(env, jname, name);
-  }
+  free( name );
 
   return (jint) iterationId;
-
 }
 
 /**
@@ -473,14 +443,14 @@ Java_org_openafs_jafs_Group_getGroupMembersNextString
   char *userName = (char *) malloc( sizeof(char)*PTS_MAX_NAME_LEN);
   jstring juser;
 
-  if( !userName ) {
+  if ( !userName ) {
     throwAFSException( env, JAFSADMNOMEM );
     return;    
   }
 
-  if( !pts_GroupMemberListNext( (void *) iterationId, userName, &ast ) ) {
+  if ( !pts_GroupMemberListNext( (void *) iterationId, userName, &ast ) ) {
     free( userName );
-    if( ast == ADMITERATORDONE ) {
+    if ( ast == ADMITERATORDONE ) {
       return NULL;
     } else {
       throwAFSException( env, ast );
@@ -516,14 +486,14 @@ Java_org_openafs_jafs_Group_getGroupMembersNext
 
   userName = (char *) malloc( sizeof(char)*PTS_MAX_NAME_LEN);
 
-  if( !userName ) {
+  if ( !userName ) {
     throwAFSException( env, JAFSADMNOMEM );
     return;    
   }
 
-  if( !pts_GroupMemberListNext( (void *) iterationId, userName, &ast ) ) {
+  if ( !pts_GroupMemberListNext( (void *) iterationId, userName, &ast ) ) {
     free( userName );
-    if( ast == ADMITERATORDONE ) {
+    if ( ast == ADMITERATORDONE ) {
       return 0;
     } else {
       throwAFSException( env, ast );
@@ -533,7 +503,7 @@ Java_org_openafs_jafs_Group_getGroupMembersNext
 
   juser = (*env)->NewStringUTF(env, userName);
 
-  if( userCls == 0 ) {
+  if ( userCls == 0 ) {
     internal_getUserClass( env, juserObject );
   }
 
@@ -560,11 +530,10 @@ Java_org_openafs_jafs_Group_getGroupMembersDone
 {
   afs_status_t ast;
 
-  if( !pts_GroupMemberListDone( (void *) iterationId, &ast ) ) {
+  if ( !pts_GroupMemberListDone( (void *) iterationId, &ast ) ) {
     throwAFSException( env, ast );
     return;
   }
-
 }
 
 /**
@@ -582,49 +551,39 @@ Java_org_openafs_jafs_Group_addMember
    jstring juserName )
 {
   afs_status_t ast;
-  const char *groupName;
-  const char *userName;
+  char *groupName;
+  char *userName;
 
-  if( jgroupName != NULL ) {
-    groupName = (*env)->GetStringUTFChars(env, jgroupName, 0);
-    if( !groupName ) {
+  if ( jgroupName != NULL ) {
+    groupName = getNativeString(env, jgroupName);
+    if ( groupName == NULL ) {
        throwAFSException( env, JAFSADMNOMEM );
        return;    
     }
   } else {
-    groupName = NULL;
+    throwAFSException( env, JAFSNULLGROUP );
+    return;
   }
 
-  if( juserName != NULL ) {
-    userName = (*env)->GetStringUTFChars(env, juserName, 0);
-    if( !userName ) {
-      if( groupName != NULL ) {
-       (*env)->ReleaseStringUTFChars(env, jgroupName, groupName);
-      }
+  if ( juserName != NULL ) {
+    userName = getNativeString(env, juserName);
+    if ( userName == NULL ) {
+      free( groupName );
       throwAFSException( env, JAFSADMNOMEM );
       return;    
     }
   } else {
-    userName = NULL;
+    free( groupName );
+    throwAFSException( env, JAFSNULLUSER );
+    return;
   }
 
-  if( !pts_GroupMemberAdd( (void *) cellHandle, userName, groupName, &ast ) ) {
-    if( groupName != NULL ) {
-      (*env)->ReleaseStringUTFChars(env, jgroupName, groupName);
-    }
-    if( userName != NULL ) {
-      (*env)->ReleaseStringUTFChars(env, juserName, userName);
-    }
+  if ( !pts_GroupMemberAdd( (void *) cellHandle, userName, groupName, &ast ) ) {
     throwAFSException( env, ast );
-    return;
   }
 
-  if( groupName != NULL ) {
-    (*env)->ReleaseStringUTFChars(env, jgroupName, groupName);
-  }
-  if( userName != NULL ) {
-    (*env)->ReleaseStringUTFChars(env, juserName, userName);
-  }
+  free( userName );
+  free( groupName );
 }
 
 /**
@@ -643,50 +602,40 @@ Java_org_openafs_jafs_Group_removeMember
    jstring juserName)
 {
   afs_status_t ast;
-  const char *groupName;
-  const char *userName;
+  char *groupName;
+  char *userName;
 
-  if( jgroupName != NULL ) {
-    groupName = (*env)->GetStringUTFChars(env, jgroupName, 0);
-    if( !groupName ) {
+  if ( jgroupName != NULL ) {
+    groupName = getNativeString(env, jgroupName);
+    if ( groupName == NULL ) {
        throwAFSException( env, JAFSADMNOMEM );
        return;    
     }
   } else {
-    groupName = NULL;
+    throwAFSException( env, JAFSNULLGROUP );
+    return;
   }
 
-  if( juserName != NULL ) {
-    userName = (*env)->GetStringUTFChars(env, juserName, 0);
-    if( !userName ) {
-      if( groupName != NULL ) {
-       (*env)->ReleaseStringUTFChars(env, jgroupName, groupName);
-      }
+  if ( juserName != NULL ) {
+    userName = getNativeString(env, juserName);
+    if ( userName == NULL ) {
+      free( groupName );
       throwAFSException( env, JAFSADMNOMEM );
       return;    
     }
   } else {
-    userName = NULL;
+    free( groupName );
+    throwAFSException( env, JAFSNULLUSER );
+    return;
   }
 
-  if( !pts_GroupMemberRemove( (void *)cellHandle, userName, 
+  if ( !pts_GroupMemberRemove( (void *)cellHandle, userName, 
                              groupName, &ast ) ) {
-    if( groupName != NULL ) {
-      (*env)->ReleaseStringUTFChars(env, jgroupName, groupName);
-    }
-    if( userName != NULL ) {
-      (*env)->ReleaseStringUTFChars(env, juserName, userName);
-    }
     throwAFSException( env, ast );
-    return;
   }
   
-  if( groupName != NULL ) {
-    (*env)->ReleaseStringUTFChars(env, jgroupName, groupName);
-  }
-  if( userName != NULL ) {
-    (*env)->ReleaseStringUTFChars(env, juserName, userName);
-  }
+  free( groupName );
+  free( userName );
 }
 
 /**
@@ -705,51 +654,40 @@ Java_org_openafs_jafs_Group_changeOwner
    jstring jownerName )
 {
   afs_status_t ast;
-  const char *groupName;
-  const char *ownerName;
+  char *groupName;
+  char *ownerName;
 
-  if( jgroupName != NULL ) {
-    groupName = (*env)->GetStringUTFChars(env, jgroupName, 0);
-    if( !groupName ) {
+  if ( jgroupName != NULL ) {
+    groupName = getNativeString(env, jgroupName);
+    if ( groupName == NULL ) {
        throwAFSException( env, JAFSADMNOMEM );
        return;    
     }
   } else {
-    groupName = NULL;
+    throwAFSException( env, JAFSNULLGROUP );
+    return;
   }
 
-  if( jownerName != NULL ) {
-    ownerName = (*env)->GetStringUTFChars(env, jownerName, 0);
-    if( !ownerName ) {
-      if( groupName != NULL ) {
-       (*env)->ReleaseStringUTFChars(env, jgroupName, groupName);
-      }
+  if ( jownerName != NULL ) {
+    ownerName = getNativeString(env, jownerName);
+    if ( ownerName == NULL ) {
+      free( groupName );
       throwAFSException( env, JAFSADMNOMEM );
       return;    
     }
   } else {
-    ownerName = NULL;
+    free( groupName );
+    throwAFSException( env, JAFSNULLOWNER );
+    return;
   }
 
-  if( !pts_GroupOwnerChange( (void *)cellHandle, groupName, 
+  if ( !pts_GroupOwnerChange( (void *)cellHandle, groupName, 
                             ownerName, &ast ) ) {
-    if( groupName != NULL ) {
-      (*env)->ReleaseStringUTFChars(env, jgroupName, groupName);
-    }
-    if( ownerName != NULL ) {
-    (*env)->ReleaseStringUTFChars(env, jownerName, ownerName);
-    }
     throwAFSException( env, ast );
-    return; 
   }
 
-  if( groupName != NULL ) {
-    (*env)->ReleaseStringUTFChars(env, jgroupName, groupName);
-  }
-  if( ownerName != NULL ) {
-    (*env)->ReleaseStringUTFChars(env, jownerName, ownerName);
-  }
-  
+  free( groupName );
+  free( ownerName );
 }
 
 /**
@@ -767,61 +705,48 @@ Java_org_openafs_jafs_Group_rename
    jstring jgroupNewName )
 {
   afs_status_t ast;
-  const char *groupOldName;
-  const char *groupNewName;
+  char *groupOldName;
+  char *groupNewName;
 
-  if( jgroupOldName != NULL ) {
-    groupOldName = (*env)->GetStringUTFChars(env, jgroupOldName, 0);
-    if( !groupOldName ) {
+  if ( jgroupOldName != NULL ) {
+    groupOldName = getNativeString(env, jgroupOldName);
+    if ( groupOldName == NULL ) {
        throwAFSException( env, JAFSADMNOMEM );
        return;    
     }
   } else {
-    groupOldName = NULL;
+    throwAFSException( env, JAFSNULLGROUP );
+    return;
   }
 
-  if( jgroupNewName != NULL ) {
-    groupNewName = (*env)->GetStringUTFChars(env, jgroupNewName, 0);
-    if( !groupNewName ) {
-      if( groupOldName != NULL ) {
-        (*env)->ReleaseStringUTFChars(env, jgroupOldName, groupOldName);
-      }
+  if ( jgroupNewName != NULL ) {
+    groupNewName = getNativeString(env, jgroupNewName);
+    if ( groupNewName == NULL ) {
+      free( groupOldName );
       throwAFSException( env, JAFSADMNOMEM );
       return;    
     }
   } else {
-    groupNewName = NULL;
+    free( groupOldName );
+    throwAFSException( env, JAFSNULLGROUP );
+    return;
   }
 
-  if( !pts_GroupRename( (void *)cellHandle, groupOldName, 
+  if ( !pts_GroupRename( (void *)cellHandle, groupOldName, 
                        groupNewName, &ast ) ) {
-    if( groupOldName != NULL ) {
-      (*env)->ReleaseStringUTFChars(env, jgroupOldName, groupOldName);
-    }
-    if( groupNewName != NULL ) {
-      (*env)->ReleaseStringUTFChars(env, jgroupNewName, groupNewName);
-    }
     throwAFSException( env, ast );
-    return;
   }
 
-  if( groupOldName != NULL ) {
-    (*env)->ReleaseStringUTFChars(env, jgroupOldName, groupOldName);
-  }
-  if( groupNewName != NULL ) {
-    (*env)->ReleaseStringUTFChars(env, jgroupNewName, groupNewName);
-  }
+  free( groupOldName );
+  free( groupNewName );
 }
 
 // reclaim global memory used by this portion
 JNIEXPORT void JNICALL 
 Java_org_openafs_jafs_Group_reclaimGroupMemory (JNIEnv *env, jclass cls)
 {
-  if( groupCls ) {
-      (*env)->DeleteGlobalRef(env, groupCls);
-      groupCls = 0;
+  if ( groupCls ) {
+    (*env)->DeleteGlobalRef(env, groupCls);
+    groupCls = 0;
   }
 }
-
-
-
index c43bcb4679513163356ebf24a41d7114f71c640c..e9bce8c73f449b065c607e708ce3dbb097345220 100644 (file)
 
 extern int errno;
 
+jmethodID  MID_String_getBytes = 0;
+
 #ifndef LIBJUAFS
-// user class and fields //
-jclass userCls = 0;
+/* User Class and Fields */
+jclass   userCls = 0;
 jfieldID user_ptsField = 0;
 jfieldID user_kasField = 0;
 jfieldID user_nameField = 0;
-//jfieldID user_cellHandleField = 0;
 jfieldID user_cachedInfoField = 0;
-//pts fields
+/* PTS Fields */
 jfieldID user_nameUidField = 0;
 jfieldID user_ownerUidField = 0;
 jfieldID user_creatorUidField = 0;
@@ -46,7 +47,7 @@ jfieldID user_groupCreationQuotaField = 0;
 jfieldID user_groupMembershipCountField = 0;
 jfieldID user_ownerField = 0;
 jfieldID user_creatorField = 0;
-// kas fields
+/* KAS Fields */
 jfieldID user_adminSettingField = 0;
 jfieldID user_tgsSettingField = 0;
 jfieldID user_encSettingField = 0;
@@ -65,10 +66,9 @@ jfieldID user_failLoginCountField = 0;
 jfieldID user_lockTimeField = 0;
 jfieldID user_lockedUntilField = 0;
 
-// group class and fields //
-jclass groupCls = 0;
+/* Group Class and Fields */
+jclass   groupCls = 0;
 jfieldID group_nameField = 0;
-//jfieldID group_cellHandleField = 0;
 jfieldID group_cachedInfoField = 0;
 jfieldID group_nameUidField = 0;
 jfieldID group_ownerUidField = 0;
@@ -82,10 +82,9 @@ jfieldID group_membershipCountField = 0;
 jfieldID group_ownerField = 0;
 jfieldID group_creatorField = 0;
 
-// server class and fields //
-jclass serverCls = 0;
+/* Server Class and Fields */
+jclass   serverCls = 0;
 jfieldID server_nameField = 0;
-//jfieldID server_cellHandleField = 0;
 jfieldID server_cachedInfoField = 0;
 jfieldID server_databaseField = 0;
 jfieldID server_fileServerField = 0;
@@ -93,8 +92,8 @@ jfieldID server_badDatabaseField = 0;
 jfieldID server_badFileServerField = 0;
 jfieldID server_IPAddressField = 0;
 
-// executable time class and fields //
-jclass exectimeCls = 0;
+/* Executable Time Class and Fields */
+jclass   exectimeCls = 0;
 jfieldID exectime_HourField = 0;
 jfieldID exectime_MinField = 0;
 jfieldID exectime_SecField = 0;
@@ -102,8 +101,8 @@ jfieldID exectime_DayField = 0;
 jfieldID exectime_NowField = 0;
 jfieldID exectime_NeverField = 0;
 
-// partition class and fields //
-jclass partitionCls = 0;
+/* Partition Class and Fields */
+jclass   partitionCls = 0;
 jfieldID partition_nameField = 0;
 jfieldID partition_cachedInfoField = 0;
 jfieldID partition_idField = 0;
@@ -112,8 +111,8 @@ jfieldID partition_lockFileDescriptorField = 0;
 jfieldID partition_totalSpaceField = 0;
 jfieldID partition_totalFreeSpaceField = 0;
 
-// volume class and fields //
-jclass volumeCls = 0;
+/* Volume Class and Fields */
+jclass   volumeCls = 0;
 jfieldID volume_nameField = 0;
 jfieldID volume_cachedInfoField = 0;
 jfieldID volume_idField = 0;
@@ -133,8 +132,8 @@ jfieldID volume_statusField = 0;
 jfieldID volume_dispositionField = 0;
 jfieldID volume_typeField = 0;
 
-// key class and fields //
-jclass keyCls = 0;
+/* Key Class and Fields */
+jclass   keyCls = 0;
 jfieldID key_cachedInfoField = 0;
 jfieldID key_versionField = 0;
 jfieldID key_encryptionKeyField = 0;
@@ -142,11 +141,10 @@ jfieldID key_lastModDateField = 0;
 jfieldID key_lastModMsField = 0;
 jfieldID key_checkSumField = 0;
 
-// process class and fields //
-jclass processCls = 0;
+/* Process Class and Fields */
+jclass   processCls = 0;
 jfieldID process_cachedInfoField = 0;
 jfieldID process_nameField = 0;
-//jfieldID process_serverHandleField = 0;
 jfieldID process_typeField = 0;
 jfieldID process_stateField = 0;
 jfieldID process_goalField = 0;
@@ -159,6 +157,7 @@ jfieldID process_errorSignalField = 0;
 jfieldID process_stateOkField = 0;
 jfieldID process_stateTooManyErrorsField = 0;
 jfieldID process_stateBadFileAccessField = 0;
+
 #endif /* !LIBJUAFS */
 
 /**
@@ -173,23 +172,20 @@ void throwException
   if( *excCls == 0 ) {
     *excCls = (*env)->NewGlobalRef(env, (*env)->FindClass(env, excClsName ));
     if( !*excCls ) {
-      fprintf(stderr, "ERROR: Internal::throwException()\n
-                       Cannot find class: %s\n", excClsName);
+      fprintf(stderr, "ERROR: Internal::throwException()\n Cannot find class: %s\n", excClsName);
        return;
     }
     *initID = (*env)->GetMethodID( env, *excCls, "<init>", "(I)V" );
     if( !*initID ) {
-      fprintf(stderr, "ERROR: Internal::throwException()\n
-                       Cannot find construction method: %s\n",
-                       excClsName);
+      fprintf(stderr, "ERROR: Internal::throwException()\n Cannot find construction method: %s\n",
+             excClsName);
        return;
     }
   }
   
   exc = (*env)->NewObject( env, *excCls, *initID, code );
   if( !exc ) {
-    fprintf(stderr, "ERROR: Internal::throwException()\n
-                     Cannot construct new exception object: %s\n",
+    fprintf(stderr, "ERROR: Internal::throwException()\n Cannot construct new exception object: %s\n",
                      excClsName);
     return;
   }
@@ -206,8 +202,7 @@ void throwMessageException( JNIEnv *env, char *msg )
 {
   jclass excCls = (*env)->FindClass(env, afsExceptionName);
   if(excCls == 0) {
-    fprintf(stderr, "ERROR: Internal::throwMessageException()\n
-                     Cannot find class: %s\n", afsExceptionName);
+    fprintf(stderr, "ERROR: Internal::throwMessageException()\n Cannot find class: %s\n", afsExceptionName);
     return;
   }
   (*env)->ThrowNew(env, excCls, msg);
@@ -226,16 +221,14 @@ void throwAFSException( JNIEnv *env, int code )
 
   afsExceptionCls = (*env)->FindClass(env, afsExceptionName);
   if( !afsExceptionCls ) {
-    fprintf(stderr, "ERROR: Internal::throwAFSException()\n
-                     Cannot find class: %s\n", afsExceptionName);
+    fprintf(stderr, "ERROR: Internal::throwAFSException()\n Cannot find class: %s\n", afsExceptionName);
     return;
   }
 
   afsExceptionInit = (*env)->GetMethodID( env, afsExceptionCls, 
                              "<init>", "(I)V" );
   if( !afsExceptionInit ) {
-    fprintf(stderr, "ERROR: Internal::throwAFSException()\n
-                     Cannot find construction method: %s\n",
+    fprintf(stderr, "ERROR: Internal::throwAFSException()\n Cannot find construction method: %s\n",
                      afsExceptionName);
     return;
   }
@@ -243,8 +236,7 @@ void throwAFSException( JNIEnv *env, int code )
   exc = (*env)->NewObject( env, afsExceptionCls, afsExceptionInit, code );
 
   if( !exc ) {
-    fprintf(stderr, "ERROR: Internal::throwAFSException()\n
-                     Cannot construct new exception object: %s\n",
+    fprintf(stderr, "ERROR: Internal::throwAFSException()\n Cannot construct new exception object: %s\n",
                      afsExceptionName);
     return;
   }
@@ -264,16 +256,15 @@ void throwAFSFileException( JNIEnv *env, int code, char *msg )
 
   afsFileExceptionCls = (*env)->FindClass(env, afsFileExceptionName);
   if( !afsFileExceptionCls ) {
-    fprintf(stderr, "ERROR: Internal::throwAFSFileException()\n
-                     Cannot find class: %s\n", afsFileExceptionName);
+    fprintf(stderr, "ERROR: Internal::throwAFSFileException()\n Cannot find class: %s\n", afsFileExceptionName);
     return;
   }
 
   afsFileExceptionInit = (*env)->GetMethodID( env, afsFileExceptionCls, 
                          "<init>", "(Ljava/lang/String;I)V" );
+
   if( !afsFileExceptionInit ) {
-    fprintf(stderr, "ERROR: Internal::throwAFSFileException()\n
-                     Cannot find construction method: %s\n",
+    fprintf(stderr, "ERROR: Internal::throwAFSFileException()\n Cannot find construction method: %s\n",
                      afsFileExceptionName);
     return;
   }
@@ -281,8 +272,7 @@ void throwAFSFileException( JNIEnv *env, int code, char *msg )
   exc = (*env)->NewObject( env, afsFileExceptionCls,
                            afsFileExceptionInit, msg, code );
   if( !exc ) {
-    fprintf(stderr, "ERROR: Internal::throwAFSFileException()\n
-                     Cannot construct new exception object: %s\n",
+    fprintf(stderr, "ERROR: Internal::throwAFSFileException()\n Cannot construct new exception object: %s\n",
                      afsFileExceptionName);
     return;
   }
@@ -302,25 +292,23 @@ void throwAFSSecurityException( JNIEnv *env, int code )
 
   afsSecurityExceptionCls = (*env)->FindClass(env, afsSecurityExceptionName);
   if( !afsSecurityExceptionCls ) {
-    fprintf(stderr, "ERROR: Internal::throwAFSSecurityException()\n
-                     Cannot find class: %s\n", afsSecurityExceptionName);
+    fprintf(stderr, "ERROR: Internal::throwAFSSecurityException()\n Cannot find class: %s\n", afsSecurityExceptionName);
     return;
   }
 
   afsSecurityExceptionInit = (*env)->GetMethodID( env, afsSecurityExceptionCls, 
                              "<init>", "(I)V" );
   if( !afsSecurityExceptionInit ) {
-    fprintf(stderr, "ERROR: Internal::throwAFSSecurityException()\n
-                     Cannot find construction method: %s\n",
+    fprintf(stderr, "ERROR: Internal::throwAFSSecurityException()\n Cannot find construction method: %s\n",
                      afsSecurityExceptionName);
     return;
   }
   
   exc = (*env)->NewObject( env, afsSecurityExceptionCls,
                            afsSecurityExceptionInit, code );
+
   if( !exc ) {
-    fprintf(stderr, "ERROR: Internal::throwAFSSecurityException()\n
-                     Cannot construct new exception object: %s\n",
+    fprintf(stderr, "ERROR: Internal::throwAFSSecurityException()\n Cannot construct new exception object: %s\n",
                      afsSecurityExceptionName);
     return;
   }
@@ -342,6 +330,98 @@ int setError(JNIEnv *env, jobject *obj, int code)
   return -1;
 }
 
+int setString(JNIEnv *env, jobject *obj, char *field, char *string)
+{
+  jclass cls;
+  jstring jstr;
+  jfieldID fid;
+
+  cls = (*env)->GetObjectClass(env, *obj);
+  /*fprintf(stderr, "setString: env=0x%x, obj=0x%x, cls=0x%x\n", env, obj, cls);*/
+  if (cls != NULL) {
+    fid = (*env)->GetFieldID(env, cls, field, "Ljava/lang/String;");
+    /*fprintf(stderr, "setString: field=%s, fid=0x%x\n", field, fid);*/
+    if (fid) {
+      jstr = (*env)->NewStringUTF(env, (string));
+      /*fprintf(stderr, "jstr = 0x%x\n", jstr);*/
+      (*env)->SetObjectField(env, *obj, fid, jstr);
+      return 0;
+    }
+  }
+  return -1;
+}
+
+/**
+ * Translates a jstring to a locale-specific native C string.
+ * Use in place of "GetStringUTFChars()" for internationalization
+ * purposes.
+ * 
+ * Make sure to "free()" any strings created by this function.
+ *
+ * A NULL (zero) return indicates a critical error has occurred and 
+ * relies on the caller of this function to throw a Java exception.
+ *
+ * This function does not throw any Java exceptions.
+ * 
+ *  env         the Java environment
+ *  jstr        the Java string (UTF) to translate
+ *
+ * @returns        native C string with the appropriate locale-specific 
+ *              representation
+ */
+char* getNativeString(JNIEnv *env, const jstring jstr)
+{
+  jbyteArray bytes = 0;
+  char *result = NULL;
+  jint len = 0;
+  
+  if ((*env)->EnsureLocalCapacity(env, 2) < 0) {
+    // Out of memory error
+    fprintf(stderr, "Internal::getNativeString(): ");
+    fprintf(stderr, "EnsureLocalCapacity() failed: Most likely out of memory\n");
+    return NULL;
+  }
+  
+  if ( !MID_String_getBytes ) {
+    jclass stringClass = (*env)->FindClass(env, "java/lang/String");
+    if ( !stringClass ) {
+      fprintf(stderr, "Internal::getNativeString(): ");
+      fprintf(stderr, "Could not locate Java class: java.lang.String.\n");
+      return NULL;
+    }
+
+    MID_String_getBytes = (*env)->GetMethodID(env, stringClass, "getBytes","()[B");
+    if ( !MID_String_getBytes ) {
+      fprintf(stderr, "Internal::getNativeString(): ");
+      fprintf(stderr, "Could not get Java method id for java.lang.String method \"getBytes()\".\n");
+      return NULL;
+    }
+  }
+
+  bytes = (*env)->CallObjectMethod(env, jstr, MID_String_getBytes);
+  if ( !bytes ) {
+    fprintf(stderr, "Internal::getNativeString(): ");
+    fprintf(stderr, "CallObjectMethod() failed for java.lang.String.getBytes().\n");
+    fprintf(stderr, "\tMID_String_getBytes = %d\n", MID_String_getBytes);
+    return NULL;
+  }
+
+  len = (*env)->GetArrayLength(env, bytes);
+  result = (char *)malloc(len + 1);
+
+  if ( !result ) {
+    fprintf(stderr, "Internal::getNativeString(): ");
+    fprintf(stderr, "Could not allocate memory for byte array.\n");
+    (*env)->DeleteLocalRef(env, bytes);
+    return NULL;
+  }
+  (*env)->GetByteArrayRegion(env, bytes, 0, len, (jbyte *)result);
+  result[len] = '\0';   // NULL-terminate
+
+  (*env)->DeleteLocalRef(env, bytes);
+  return result;
+}
+
 #ifdef LIBJUAFS
 
 /**
@@ -357,34 +437,46 @@ int setError(JNIEnv *env, jobject *obj, int code)
  * @returns            file descriptor
  */
 int openAFSFile
-  (JNIEnv *env, jstring fileNameUTF, int flags, int mode, int *err)
+  (JNIEnv *env, jstring filenameUTF, int flags, int mode, int *err)
 {
-    char *fileName;
+    char *filename;
     int fd = -1;
 
     *err = 0;
     errno = 0;
-    fileName=(char*) (*env)->GetStringUTFChars(env, fileNameUTF, 0);
-    if(fileName == NULL) {
-      fprintf(stderr, "Internal::openAFSFile(): failed to get fileName\n");
+    filename = getNativeString(env, filenameUTF);
+    if(filename == NULL) {
+      fprintf(stderr, "Internal::openAFSFile(): failed to get filename\n");
       *err = -1;
       return fd;
     }
-    fd  = uafs_open(fileName, flags, mode);
+    fd  = uafs_open(filename, flags, mode);
+    free( filename );
     *err = errno;
     if (errno != 0) {
       fprintf(stderr, "Internal::openAFSFile(): errno=%d\n", errno);
       fprintf(stderr, "Internal::openAFSFile(): fd=%d\n", fd);
     }
-    (*env)->ReleaseStringUTFChars(env, fileNameUTF, fileName);
     if (fd < 0) {
-      fprintf(stderr, "Internal::openAFSFile(): failed to open fileName\n");
+      fprintf(stderr, "Internal::openAFSFile(): failed to open filename\n");
       fprintf(stderr, "Internal::openAFSFile(): fd=%d\n", fd);
       return -1;
     }
     return fd;
 }
 
+/**
+ * Reads the "CacheConfig" file for user space configuration.
+ * By default, this file resides in "/usr/afswsp/etc/CacheConfig",
+ * however if the environment variable "LIBJAFS_CACHE_CONFIG" is
+ * set this function will use that value instead.
+ *
+ * The CacheConfig file contains several cache tuning parameters 
+ * as well as a few parameters that define the runtime environment 
+ * for the user space client, including: mount point location, 
+ * configuration directory (where to find ThisCell and CellServDB), 
+ * cache directory, debug and verbose options, and log file location.
+ */
 int readCacheParms(char *afsMountPoint, char *afsConfDir, char *afsCacheDir,
                    int *cacheBlocks, int *cacheFiles, int *cacheStatEntries,
                    int *dCacheSize, int *vCacheSize, int *chunkSize,
@@ -455,27 +547,6 @@ int readCacheParms(char *afsMountPoint, char *afsConfDir, char *afsCacheDir,
   return 0;
 }
 
-int setString(JNIEnv *env, jobject *obj, char *field, char *string)
-{
-  jclass cls;
-  jstring jstr;
-  jfieldID fid;
-
-  cls = (*env)->GetObjectClass(env, *obj);
-  /*fprintf(stderr, "setString: env=0x%x, obj=0x%x, cls=0x%x\n", env, obj, cls);*/
-  if (cls != NULL) {
-    fid = (*env)->GetFieldID(env, cls, field, "Ljava/lang/String;");
-    /*fprintf(stderr, "setString: field=%s, fid=0x%x\n", field, fid);*/
-    if (fid) {
-      jstr = (*env)->NewStringUTF(env, (string));
-      /*fprintf(stderr, "jstr = 0x%x\n", jstr);*/
-      (*env)->SetObjectField(env, *obj, fid, jstr);
-      return 0;
-    }
-  }
-  return -1;
-}
-
 #else
 
 /**
@@ -485,9 +556,8 @@ int setString(JNIEnv *env, jobject *obj, char *field, char *string)
  * the instance is the empty string.  The memory for who 
  * that's passed in should be fully allocated in advance.
  */
-void internal_makeKasIdentity( const char *fullName, 
-                                      kas_identity_p who ) {
-
+void internal_makeKasIdentity( const char *fullName, kas_identity_p who )
+{
   char *period;
 
   if( (period = (char *) strchr( fullName, '.' )) != NULL ) {
@@ -499,14 +569,14 @@ void internal_makeKasIdentity( const char *fullName,
     strcpy( who->principal, fullName);
     strcpy( who->instance, "" );
   }
-
 }
 
 /**
  * Given a Java environment and an instance of a user, gets the object and
  * field information for the user object from the Java environment.
  */
-void internal_getUserClass( JNIEnv *env, jobject user ) {
+void internal_getUserClass( JNIEnv *env, jobject user )
+{
   if( userCls == 0 ) {
     userCls = (*env)->NewGlobalRef( env, (*env)->GetObjectClass(env, user) );
     if( !userCls ) {
@@ -595,7 +665,6 @@ void internal_getUserClass( JNIEnv *env, jobject user ) {
 
        throwAFSException( env, JAFSADMFIELDNOTFOUND );
        return;
-
     }
   } 
 }
@@ -604,7 +673,8 @@ void internal_getUserClass( JNIEnv *env, jobject user ) {
  * Given a Java environment and an instance of a group, gets the object and
  * field information for the group object from the Java environment.
  */
-void internal_getGroupClass( JNIEnv *env, jobject group ) {
+void internal_getGroupClass( JNIEnv *env, jobject group )
+{
   if( groupCls == 0 ) {
     groupCls = (*env)->NewGlobalRef( env, (*env)->GetObjectClass(env, group) );
     if( !groupCls ) {
@@ -643,7 +713,6 @@ void internal_getGroupClass( JNIEnv *env, jobject group ) {
 
        throwAFSException( env, JAFSADMFIELDNOTFOUND );
        return;
-
     }
   }
 }
@@ -652,7 +721,8 @@ void internal_getGroupClass( JNIEnv *env, jobject group ) {
  * Given a Java environment and an instance of a server, gets the object and
  * field information for the server object from the Java environment.
  */
-void internal_getServerClass( JNIEnv *env, jobject server ) {
+void internal_getServerClass( JNIEnv *env, jobject server )
+{
   if( serverCls == 0 ) {
     serverCls = (*env)->NewGlobalRef( env,
                                       (*env)->GetObjectClass(env, server) );
@@ -690,7 +760,8 @@ void internal_getServerClass( JNIEnv *env, jobject server ) {
  * object and field information for the executableTime object from the 
  * Java environment.
  */
-void internal_getExecTimeClass( JNIEnv *env, jobject exectime ) {
+void internal_getExecTimeClass( JNIEnv *env, jobject exectime )
+{
   if( exectimeCls == 0 ) {
     exectimeCls = (*env)->NewGlobalRef( env, 
                                       (*env)->GetObjectClass(env, exectime) );
@@ -720,7 +791,8 @@ void internal_getExecTimeClass( JNIEnv *env, jobject exectime ) {
  * Given a Java environment and an instance of a partition, gets the object and
  * field information for the partition object from the Java environment.
  */
-void internal_getPartitionClass( JNIEnv *env, jobject partition ) {
+void internal_getPartitionClass( JNIEnv *env, jobject partition )
+{
   if( partitionCls == 0 ) {
     partitionCls = (*env)->NewGlobalRef( env, 
                                      (*env)->GetObjectClass(env, partition) );
@@ -759,7 +831,8 @@ void internal_getPartitionClass( JNIEnv *env, jobject partition ) {
  * Given a Java environment and an instance of a volume, gets the object and
  * field information for the volume object from the Java environment.
  */
-void internal_getVolumeClass( JNIEnv *env, jobject volume ) {
+void internal_getVolumeClass( JNIEnv *env, jobject volume )
+{
   if( volumeCls == 0 ) {
     volumeCls = (*env)->NewGlobalRef( env, 
                                      (*env)->GetObjectClass(env, volume) );
@@ -823,7 +896,8 @@ void internal_getVolumeClass( JNIEnv *env, jobject volume ) {
  * Given a Java environment and an instance of a key, gets the object and
  * field information for the key object from the Java environment.
  */
-void internal_getKeyClass( JNIEnv *env, jobject key ) {
+void internal_getKeyClass( JNIEnv *env, jobject key )
+{
   if( keyCls == 0 ) {
     keyCls = (*env)->NewGlobalRef( env, (*env)->GetObjectClass(env, key) );
     if( !keyCls ) {
@@ -854,7 +928,8 @@ void internal_getKeyClass( JNIEnv *env, jobject key ) {
  * Given a Java environment and an instance of a process, gets the object and
  * field information for the process object from the Java environment.
  */
-void internal_getProcessClass( JNIEnv *env, jobject process ) {
+void internal_getProcessClass( JNIEnv *env, jobject process )
+{
   if( processCls == 0 ) {
     processCls = (*env)->NewGlobalRef( env, 
                                       (*env)->GetObjectClass(env, process) );
@@ -905,5 +980,3 @@ void internal_getProcessClass( JNIEnv *env, jobject process ) {
 }
 
 #endif /* LIBJUAFS */
-
-
index 29d9129e4113a7047b5a19c1eb492e1abaaa1f83..14b91cd678cb08f19792481303865b2f7f78f3ef 100644 (file)
@@ -4,15 +4,32 @@
 #include <jni.h>
 #include "Exceptions.h"
 
-#ifndef LIBJUAFS
-#include <afs_Admin.h>
-#include <afs_kasAdmin.h>
-
-// error codes
-#define JAFSADMNOMEM 1050             // Memory problems
+/** 
+ * ERROR CODES
+ *
+ * Please add any internal error codes to the ErrorMessages.properties
+ * file located in src/JAVA/classes/
+ */
+#define JAFSADMNOMEM          1050    // Memory problems
 #define JAFSADMCLASSNOTFOUND  1051    // Trouble finding a Java class
 #define JAFSADMMETHODNOTFOUND 1052    // Trouble finding a Java method
 #define JAFSADMFIELDNOTFOUND  1053    // Trouble finding a Java field
+#define JAFSNULLARG           1054    // Null argument (general)
+#define JAFSNULLUSER          1055    // User argument null
+#define JAFSNULLPASS          1056    // Password argument null
+#define JAFSNULLGROUP         1057    // Group name argument null
+#define JAFSNULLOWNER         1058    // Group owner name argument null
+#define JAFSNULLVOLUME        1059    // Volume name argument null
+#define JAFSNULLPART          1060    // Partition name argument null
+#define JAFSNULLPROCESS       1061    // Process name argument null
+#define JAFSNULLSERVER        1062    // Server name argument null
+#define JAFSNULLCELL          1063    // Cell name argument null
+#define JAFSNULLPATH          1064    // Path argument null
+#define JAFSNULLACL           1065    // ACL string argument null
+
+#ifndef LIBJUAFS
+#include <afs_Admin.h>
+#include <afs_kasAdmin.h>
 
 // make an identity out of a full name (possibly including an instance ) 
 void internal_makeKasIdentity( const char *fullName, kas_identity_p who );
@@ -54,8 +71,9 @@ void throwException( JNIEnv *env, jclass *excCls, char *excClsName, jmethodID *i
 // reclaim global memory used by exceptions 
 void reclaimExceptionMemory( JNIEnv *env, jclass cls );
 
-int setError(JNIEnv *env, jobject *obj, int code);
-int setString(JNIEnv *env, jobject *obj, char *field, char *string);
+int     setError (JNIEnv *env, jobject *obj, int code);
+int     setString(JNIEnv *env, jobject *obj, char *field, char *string);
+char*   getNativeString(JNIEnv *env, jstring jstr);
 
 #endif
 
index a9ddac94d6296d0d278b0c8c80d9419bc2bd8ceb..19486f82d634c0c029cab8894fea385f9a31a106 100644 (file)
@@ -27,7 +27,7 @@
 #include <kautils.h>
 
 //// definitions in Internal.c  //////////////////
-extern jclass keyCls;
+extern jclass   keyCls;
 extern jfieldID key_versionField;
 extern jfieldID key_encryptionKeyField;
 extern jfieldID key_lastModDateField;
@@ -51,7 +51,7 @@ void fillKeyInfo( JNIEnv *env, jobject key, bos_KeyInfo_t keyEntry )
   int i;
 
   // get the class fields if need be
-  if( keyCls == 0 ) {
+  if ( keyCls == 0 ) {
     internal_getKeyClass( env, key );
   }
 
@@ -60,7 +60,7 @@ void fillKeyInfo( JNIEnv *env, jobject key, bos_KeyInfo_t keyEntry )
   
   convertedKey = (char *) malloc( sizeof(char *)*
                                  (sizeof(keyEntry.key.key)*4+1) );
-  if( !convertedKey ) {
+  if ( !convertedKey ) {
     throwAFSException( env, JAFSADMNOMEM );
     return;    
   }
@@ -100,7 +100,7 @@ Java_org_openafs_jafs_Key_getKeyInfo
   void *iterationId;
   int done;
 
-  if( !bos_KeyGetBegin( (void *) serverHandle, &iterationId, &ast ) ) {
+  if ( !bos_KeyGetBegin( (void *) serverHandle, &iterationId, &ast ) ) {
     throwAFSException( env, ast );
     return;
   }
@@ -111,11 +111,11 @@ Java_org_openafs_jafs_Key_getKeyInfo
   // one with the matching version
   while( !done ) {
 
-    if( !bos_KeyGetNext( iterationId, &keyEntry, &ast ) ) {
+    if ( !bos_KeyGetNext( iterationId, &keyEntry, &ast ) ) {
       // no matching key
-      if( ast == ADMITERATORDONE ) {
+      if ( ast == ADMITERATORDONE ) {
         afs_status_t astnew;
-        if( !bos_KeyGetDone( iterationId, &astnew ) ) {
+        if ( !bos_KeyGetDone( iterationId, &astnew ) ) {
           throwAFSException( env, astnew );
           return;
         }
@@ -128,7 +128,7 @@ Java_org_openafs_jafs_Key_getKeyInfo
       }
     }
 
-    if( keyEntry.keyVersionNumber == version ) {
+    if ( keyEntry.keyVersionNumber == version ) {
       done = TRUE;
     }
 
@@ -136,7 +136,7 @@ Java_org_openafs_jafs_Key_getKeyInfo
 
   fillKeyInfo( env, key, keyEntry );
 
-  if( !bos_KeyGetDone( iterationId, &ast ) ) {
+  if ( !bos_KeyGetDone( iterationId, &ast ) ) {
     throwAFSException( env, ast );
     return;
   }
@@ -161,19 +161,20 @@ Java_org_openafs_jafs_Key_create
    jstring jkeyString)
 {
     afs_status_t ast;
-    const char *keyString;
+    char *keyString;
     char *cellName;
     kas_encryptionKey_p key = 
       (kas_encryptionKey_p) malloc( sizeof(kas_encryptionKey_t) );
     
-    if( !key ) {
+    if ( !key ) {
       throwAFSException( env, JAFSADMNOMEM );
       return;    
     }
 
-    if( jkeyString != NULL ) {
-      keyString = (*env)->GetStringUTFChars(env, jkeyString, 0);
-      if( !keyString ) {
+    if ( jkeyString != NULL ) {
+      keyString = getNativeString(env, jkeyString);
+      if ( keyString == NULL ) {
+        free( key );
          throwAFSException( env, JAFSADMNOMEM );
          return;    
       }
@@ -181,37 +182,29 @@ Java_org_openafs_jafs_Key_create
       keyString = NULL;
     }
 
-    if( !afsclient_CellNameGet( (void *) cellHandle, &cellName, &ast ) ) {
+    if ( !afsclient_CellNameGet( (void *) cellHandle, &cellName, &ast ) ) {
        free( key );
-       if( keyString != NULL ) {
-         (*env)->ReleaseStringUTFChars(env, jkeyString, keyString);
-       }
+      if ( keyString != NULL ) free( keyString );
        throwAFSException( env, ast );
        return;
     }   
 
-    if( !kas_StringToKey( cellName, keyString, key, &ast ) ) {
+    if ( !kas_StringToKey( cellName, keyString, key, &ast ) ) {
        free( key );
-       if( keyString != NULL ) {
-         (*env)->ReleaseStringUTFChars(env, jkeyString, keyString);
-       }
+      if ( keyString != NULL ) free( keyString );
        throwAFSException( env, ast );
        return;
     }
 
-    if( !bos_KeyCreate( (void *) serverHandle, version, key, &ast ) ) {
+    if ( !bos_KeyCreate( (void *) serverHandle, version, key, &ast ) ) {
        free( key );
-       if( keyString != NULL ) {
-         (*env)->ReleaseStringUTFChars(env, jkeyString, keyString);
-       }
+      if ( keyString != NULL ) free( keyString );
        throwAFSException( env, ast );
        return;
     }
 
     free( key );
-    if( keyString != NULL ) {
-      (*env)->ReleaseStringUTFChars(env, jkeyString, keyString);
-    }
+    if ( keyString != NULL ) free( keyString );
 }
 
 /**
@@ -226,24 +219,20 @@ JNIEXPORT void JNICALL
 Java_org_openafs_jafs_Key_delete
   (JNIEnv *env, jclass cls, jint serverHandle, jint version )
 {
-    afs_status_t ast;
+  afs_status_t ast;
 
-    if( !bos_KeyDelete( (void *) serverHandle, version, &ast ) ) {
-       throwAFSException( env, ast );
-       return;
-    }
+  if ( !bos_KeyDelete( (void *) serverHandle, version, &ast ) ) {
+    throwAFSException( env, ast );
+    return;
+  }
 }
 
 // reclaim global memory being used by this portion
 JNIEXPORT void JNICALL
 Java_org_openafs_jafs_Key_reclaimKeyMemory (JNIEnv *env, jclass cls)
 {
-  if( keyCls ) {
-      (*env)->DeleteGlobalRef(env, keyCls);
-      keyCls = 0;
+  if ( keyCls ) {
+    (*env)->DeleteGlobalRef(env, keyCls);
+    keyCls = 0;
   }
 }
-
-
-
-
index 9d03a74776f9dcb16b0d9d967d769bb870166686..0ae417ce1ebcbc00790eb269b0e4f0bfcd3237c5 100644 (file)
@@ -27,28 +27,36 @@ COMPILE_ET=${TOP_SRCDIR}/comerr/compile_et
 RXGEN=${TOP_SRCDIR}/rxgen/rxgen
 SYS_NAME=@AFS_SYSNAME@
 
+include ../../config/Makefile.${SYS_NAME}
 
 CC = ${MT_CC}
 SHARED_FLAGS = -shared
 OBJECT_FLAGS = -fPIC -c
 
 ifeq "$(BUILD_TYPE)" "admin"
-       INC := -I${TOP_INCDIR} -I${TOP_INCDIR}/afs/ -I${JAVA_HOME}/include ${JNI_INC}
+       INC := -I${TOP_INCDIR} -I${TOP_INCDIR}/afs/ ${JNI_INC}
        CFLAGS := ${INC} ${DBG} ${OPTMZ} -I${TOP_SRCDIR}/config ${MT_CFLAGS}
 else
-       INC := -I${TOP_SRCDIR}/libuafs -I${TOP_INCDIR} -I${JAVA_HOME}/include ${JNI_INC}
+       INC := -I${TOP_SRCDIR}/libuafs -I${TOP_INCDIR} -I${TOP_SRCDIR} ${JNI_INC}
        CFLAGS := ${INC} ${DBG} ${OPTMZ} ${FSINCLUDES} -D_REENTRANT -DLIBJUAFS ${MT_CFLAGS}
 endif
 
+ifeq "$(INCREMENT_BUILD)" "false"
+       INCREMENT_CMD :=
+else
+       INCREMENT_CMD := ${RM} -f ${LIBJAFSADMDIR}VersionInfo.o; perl buildinfo.pl ${LIBJAFSADMDIR}VersionInfo.h -i;
+endif
 
 LIBJAFSADMDIR = ./
 ROOTPACKAGEDIR = ../classes
 RELPACKAGEDIR = org/openafs/jafs/
 PACKAGEDIR = ${ROOTPACKAGEDIR}/${RELPACKAGEDIR}
-JAVADOCSDIR = javadocs/
+JAVADOCSDIR = ../javadocs/
+BUILD_VERSION = `perl buildinfo.pl ${LIBJAFSADMDIR}VersionInfo.h -version`
 
 JAVAH = ${JAVA_HOME}/bin/javah -classpath ${ROOTPACKAGEDIR} -jni -d ${LIBJAFSADMDIR}
 JAVAC = ${JAVA_HOME}/bin/javac -classpath ${ROOTPACKAGEDIR}
+JAVADOC = ${JAVA_HOME}/bin/javadoc
 
 J_NATIVE_PREFIX = org.openafs.jafs.
 C_NATIVE_PREFIX = org_openafs_jafs_
@@ -69,6 +77,7 @@ PACKAGE =\
        ${PACKAGEDIR}Server.class \
        ${PACKAGEDIR}Token.class \
        ${PACKAGEDIR}User.class \
+       ${PACKAGEDIR}VersionInfo.class \
        ${PACKAGEDIR}Volume.class
 
 LIBJAFS_OBJS =\
@@ -77,7 +86,8 @@ LIBJAFS_OBJS =\
        ${LIBJAFSADMDIR}FileInputStream.o \
        ${LIBJAFSADMDIR}FileOutputStream.o \
        ${LIBJAFSADMDIR}Internal.o \
-       ${LIBJAFSADMDIR}UserToken.o
+       ${LIBJAFSADMDIR}UserToken.o \
+       ${LIBJAFSADMDIR}VersionInfo.o
 
 LIBJAFSADM_OBJS =\
        ${LIBJAFSADMDIR}AdminToken.o \
@@ -89,6 +99,7 @@ LIBJAFSADM_OBJS =\
        ${LIBJAFSADMDIR}Process.o \
        ${LIBJAFSADMDIR}Server.o \
        ${LIBJAFSADMDIR}User.o \
+       ${LIBJAFSADMDIR}VersionInfo.o \
        ${LIBJAFSADMDIR}Volume.o
 
 CORRELATING_SOURCE_FILES =\
@@ -103,6 +114,7 @@ CORRELATING_SOURCE_FILES =\
        ${LIBJAFSADMDIR}Process.c \
        ${LIBJAFSADMDIR}Server.c \
        ${LIBJAFSADMDIR}User.c \
+       ${LIBJAFSADMDIR}VersionInfo.c \
        ${LIBJAFSADMDIR}Volume.c
 
 JAVA_HEADERS = ${PACKAGE:${PACKAGEDIR}%.class=${C_NATIVE_PREFIX}%.h}
@@ -132,15 +144,14 @@ LIBJAFSADM_LIBS =\
        ${TOP_LIBDIR}/libafsauthent.a \
        ${TOP_LIBDIR}/libafsrpc.a \
        ${TOP_LIBDIR}/libcmd.a \
+       ${TOP_LIBDIR}/util.a \
        -lresolv \
        -lpthread
 
 
 JARFILE = jafs.jar
 
-include ../../config/Makefile.${SYS_NAME}
-
-all:  ${TOP_JLIBDIR} libjafs libjafsadm ${PACKAGE} all_jar
+all:  ${TOP_JLIBDIR} libjafs libjafsadm ${PACKAGE} jar
 
 install:  all ${DESTDIR}${libdir}/libjafs.so ${DESTDIR}${libdir}/libjafsadm.so ${PACKAGE} install_jar
        if [ ! -e /usr/afswsp ]; then \
@@ -163,27 +174,39 @@ install:  all ${DESTDIR}${libdir}/libjafs.so ${DESTDIR}${libdir}/libjafsadm.so $
          ln -s /usr/vice/etc/ThisCell /usr/afswsp/etc/; \
        fi
 
+### Clean "C" and Java objects
 clean:
-       ${RM} -f ${PACKAGEDIR}*.class ${LIBJAFSADMDIR}*.o ${LIBJAFSADMDIR}${C_NATIVE_PREFIX}*.h
+       ${RM} -f ${PACKAGEDIR}*.class ${LIBJAFSADMDIR}*.o ${LIBJAFSADMDIR}${C_NATIVE_PREFIX}*.h ${LIBJAFSADMDIR}acltest
+       ${RM} -fR ${JAVADOCSDIR}
+
+### Clean just "C" objects
+cleanc:
+       ${RM} -f ${LIBJAFSADMDIR}*.o ${LIBJAFSADMDIR}acltest
+
+increment-build:
+       ${INCREMENT_CMD} \
+        export INCREMENT_BUILD=false;
 
 setup: FORCE
-       if [ ! -e ./h ]; then \
-         ln -s /usr/include/sys h; \
-       fi; \
 
 ${TOP_JLIBDIR}:
        mkdir -p $@
 
 FORCE: ;
 
+############# Test program   ###############################
+
+acltest: ${LIBJAFSADMDIR}/acltest.c
+       ${CC} ${CFLAGS} -o $@ $^ ${LIBJAFS_LIBS}
+
 ############# Shared library ###############################
 
-libjafs: setup
+libjafs: setup increment-build
        ${RM} -f ${LIBJAFSADMDIR}Internal.o; \
        export BUILD_TYPE=user; \
        ${MAKE} ${TOP_LIBDIR}/libjafs.so
 
-libjafsadm:
+libjafsadm: increment-build
        ${RM} -f ${LIBJAFSADMDIR}Internal.o; \
        export BUILD_TYPE=admin; \
        ${MAKE} ${TOP_LIBDIR}/libjafsadm.so
@@ -207,7 +230,7 @@ ${LIBJAFSADM_OBJS}: %.o: %.c
 
 ############## C files #####################################
 
-${CORRELATING_SOURCE_FILES}: ${LIBJAFSADMDIR}%.c: ${LIBJAFSADMDIR}${C_NATIVE_PREFIX}%.h ${LIBJAFSADMDIR}Internal.h
+${CORRELATING_SOURCE_FILES}: ${LIBJAFSADMDIR}%.c: ${LIBJAFSADMDIR}${C_NATIVE_PREFIX}%.h ${LIBJAFSADMDIR}Internal.h ${LIBJAFSADMDIR}VersionInfo.h
 
 ${LIBJAFSADMDIR}AdminToken.c: ${LIBJAFSADMDIR}${C_NATIVE_PREFIX}Token.h ${LIBJAFSADMDIR}${C_NATIVE_PREFIX}Cell.h
 
@@ -215,6 +238,8 @@ ${LIBJAFSADMDIR}Internal.c: ${LIBJAFSADMDIR}Internal.h
 
 ${LIBJAFSADMDIR}UserToken.c: ${LIBJAFSADMDIR}${C_NATIVE_PREFIX}Token.h
 
+${LIBJAFSADMDIR}VersionInfo.c: ${LIBJAFSADMDIR}VersionInfo.h ${LIBJAFSADMDIR}${C_NATIVE_PREFIX}VersionInfo.h
+
 ############## Package javac section #########################
 
 ${PACKAGEDIR}%.class: ${PACKAGEDIR}%.java
@@ -225,9 +250,22 @@ ${PACKAGEDIR}%.class: ${PACKAGEDIR}%.java
 ${JAVA_HEADERS}: ${C_NATIVE_PREFIX}%.h: ${PACKAGEDIR}%.class
        ${JAVAH} ${J_NATIVE_PREFIX}$*
 
+############## Javadoc section ###############################
+
+javadocs:
+       echo "Preparing Javadoc API documentation..."
+       ${JAVADOC} -version -breakiterator \
+       -link http://java.sun.com/j2se/1.4/docs/api/ \
+       -windowtitle "Java AFS API" -header "<B>JAFS API v${BUILD_VERSION}</B>" \
+       -doctitle "<B>JAFS</B> API v${BUILD_VERSION}" \
+       -use -d ${JAVADOCSDIR} \
+       -sourcepath ${ROOTPACKAGEDIR} \
+       -classpath ${ROOTPACKAGEDIR} \
+       -package org.openafs.jafs
+
 ############# JAR file #####################################
 
-all_jar: clean_jar
+jar: clean_jar
        cd ${ROOTPACKAGEDIR}; ${JAVA_HOME}/bin/jar -cMf ${TOP_JLIBDIR}/${JARFILE} *.properties ${RELPACKAGEDIR}*.class
 
 install_jar: clean_jar
@@ -236,5 +274,6 @@ install_jar: clean_jar
 clean_jar:
        ${RM} -f ${TOP_JLIBDIR}/${JARFILE}
 
-
+clean_libs:
+       ${RM} -f ${TOP_LIBDIR}/libjafs.so ${TOP_LIBDIR}/libjafsadm.so
 
index 6b35c12fc6994769699c25bb04452ce0737d8492..14af759440d743702847cfd46db0f3166d4ed8d1 100644 (file)
@@ -40,7 +40,7 @@ extern jfieldID volume_cachedInfoField;
 
 //////////////////////////////////////////////////////////
 
-///// definition in jafs_Volume.c /////////////////
+///// Definition in jafs_Volume.c /////////////////
 
 extern void fillVolumeInfo
             ( JNIEnv *env, jobject volume, vos_volumeEntry_t volEntry );
@@ -65,14 +65,14 @@ void fillPartitionInfo
   afs_status_t ast;
 
   // get the class fields if need be
-  if( partitionCls == 0 ) {
+  if ( partitionCls == 0 ) {
     internal_getPartitionClass( env, partition );
   }
 
   // fill name and id in case it's a blank object
   jpartition = (*env)->NewStringUTF(env, partEntry.name);
   // get the id
-  if( !vos_PartitionNameToId( partEntry.name, (int *) &id, &ast ) ) {
+  if ( !vos_PartitionNameToId( partEntry.name, (int *) &id, &ast ) ) {
       throwAFSException( env, ast );
       return;
   } 
@@ -138,33 +138,28 @@ Java_org_openafs_jafs_Partition_translateNameToID
 {
   afs_status_t ast;
   jint id;
-  const char *name;
+  char *name;
 
-  if( jname != NULL ) {
-    name = (*env)->GetStringUTFChars(env, jname, 0);
-    if( !name ) {
+  if ( jname != NULL ) {
+    name = getNativeString(env, jname);
+    if ( name == NULL ) {
        throwAFSException( env, JAFSADMNOMEM );
-       return;    
+       return -1;    
     }
   } else {
-    name = NULL;
+    throwAFSException( env, JAFSNULLPART );
+    return -1;
   }
 
   // get the id
-  if( !vos_PartitionNameToId( name, (unsigned int *) &id, &ast ) ) {
-    if( name != NULL ) {
-      (*env)->ReleaseStringUTFChars(env, jname, name);
-    }
+  if ( !vos_PartitionNameToId( name, (unsigned int *) &id, &ast ) ) {
+    id = -1;
     throwAFSException( env, ast );
-    return -1;
   } 
 
-  if( name != NULL ) {
-    (*env)->ReleaseStringUTFChars(env, jname, name);
-  }
+  free( name );
 
   return id;
-
 }
 
 /**
@@ -181,24 +176,22 @@ Java_org_openafs_jafs_Partition_translateIDToName
 {
   afs_status_t ast;
   char *name = (char *) malloc( sizeof(char)*VOS_MAX_PARTITION_NAME_LEN);
-  jstring jname;
+  jstring jname = NULL;
 
-  if( !name ) {
+  if ( name == NULL ) {
     throwAFSException( env, JAFSADMNOMEM );
-    return;    
+    return NULL;
   }
 
   // get the name
-  if( !vos_PartitionIdToName( (unsigned int) id, name, &ast ) ) {
-    free(name);
+  if ( vos_PartitionIdToName( (unsigned int) id, name, &ast ) ) {
+    jname = (*env)->NewStringUTF(env, name);
+  } else {
     throwAFSException( env, ast );
-    return NULL;
   } 
+  free( name );
 
-  jname = (*env)->NewStringUTF(env, name);
-  free(name);
   return jname;
-
 }
 
 /**
@@ -222,7 +215,7 @@ Java_org_openafs_jafs_Partition_getVolumeCount
   vos_volumeEntry_t volEntry;
   int i = 0;
 
-  if( !vos_VolumeGetBegin( (void *) cellHandle, (void *) serverHandle, NULL, 
+  if ( !vos_VolumeGetBegin( (void *) cellHandle, (void *) serverHandle, NULL, 
                           (unsigned int) partition, &iterationId, &ast ) ) {
     throwAFSException( env, ast );
     return -1;
@@ -230,7 +223,7 @@ Java_org_openafs_jafs_Partition_getVolumeCount
 
   while ( vos_VolumeGetNext( (void *) iterationId, &volEntry, &ast ) ) i++;
 
-  if( ast != ADMITERATORDONE ) {
+  if ( ast != ADMITERATORDONE ) {
     throwAFSException( env, ast );
     return -1;
   }
@@ -260,10 +253,10 @@ Java_org_openafs_jafs_Partition_getVolumesBegin
   afs_status_t ast;
   void *iterationId;
 
-  if( !vos_VolumeGetBegin( (void *) cellHandle, (void *) serverHandle, NULL, 
+  if ( !vos_VolumeGetBegin( (void *) cellHandle, (void *) serverHandle, NULL, 
                           (unsigned int) partition, &iterationId, &ast ) ) {
     throwAFSException( env, ast );
-    return;
+    return -1;
   }
 
   return (jint) iterationId;
@@ -294,15 +287,15 @@ Java_org_openafs_jafs_Partition_getVolumesBeginAt
   vos_volumeEntry_t volEntry;
   int i;
 
-  if( !vos_VolumeGetBegin( (void *) cellHandle, (void *) serverHandle, NULL, 
+  if ( !vos_VolumeGetBegin( (void *) cellHandle, (void *) serverHandle, NULL, 
                           (unsigned int) partition, &iterationId, &ast ) ) {
     throwAFSException( env, ast );
-    return;
+    return -1;
   }
 
   for ( i = 1; i < index; i++) {
-    if( !vos_VolumeGetNext( (void *) iterationId, &volEntry, &ast ) ) {
-      if( ast == ADMITERATORDONE ) {
+    if ( !vos_VolumeGetNext( (void *) iterationId, &volEntry, &ast ) ) {
+      if ( ast == ADMITERATORDONE ) {
         return 0;
       } else {
         throwAFSException( env, ast );
@@ -332,12 +325,12 @@ Java_org_openafs_jafs_Partition_getVolumesNextString
   jstring jvolume;
   vos_volumeEntry_t volEntry;
 
-  if( !vos_VolumeGetNext( (void *) iterationId, &volEntry, &ast ) ) {
-    if( ast == ADMITERATORDONE ) {
+  if ( !vos_VolumeGetNext( (void *) iterationId, &volEntry, &ast ) ) {
+    if ( ast == ADMITERATORDONE ) {
       return NULL;
     } else {
       throwAFSException( env, ast );
-      return;
+      return NULL;
     }
   }
 
@@ -365,8 +358,8 @@ Java_org_openafs_jafs_Partition_getVolumesNext
   jstring jvolume;
   vos_volumeEntry_t volEntry;
 
-  if( !vos_VolumeGetNext( (void *) iterationId, &volEntry, &ast ) ) {
-    if( ast == ADMITERATORDONE ) {
+  if ( !vos_VolumeGetNext( (void *) iterationId, &volEntry, &ast ) ) {
+    if ( ast == ADMITERATORDONE ) {
       return 0;
     } else {
       throwAFSException( env, ast );
@@ -378,7 +371,7 @@ Java_org_openafs_jafs_Partition_getVolumesNext
   fillVolumeInfo( env, jvolumeObject, volEntry );
 
   // get the class fields if need be
-  if( volumeCls == 0 ) {
+  if ( volumeCls == 0 ) {
     internal_getVolumeClass( env, jvolumeObject );
   }
   (*env)->SetBooleanField( env, jvolumeObject, volume_cachedInfoField, TRUE );
@@ -410,8 +403,8 @@ Java_org_openafs_jafs_Partition_getVolumesAdvanceTo
   int i;
 
   for ( i = 0; i < advanceCount; i++) {
-    if( !vos_VolumeGetNext( (void *) iterationId, &volEntry, &ast ) ) {
-      if( ast == ADMITERATORDONE ) {
+    if ( !vos_VolumeGetNext( (void *) iterationId, &volEntry, &ast ) ) {
+      if ( ast == ADMITERATORDONE ) {
         return 0;
       } else {
         throwAFSException( env, ast );
@@ -424,7 +417,7 @@ Java_org_openafs_jafs_Partition_getVolumesAdvanceTo
   fillVolumeInfo( env, jvolumeObject, volEntry );
 
   // get the class fields if need be
-  if( volumeCls == 0 ) {
+  if ( volumeCls == 0 ) {
     internal_getVolumeClass( env, jvolumeObject );
   }
   (*env)->SetBooleanField( env, jvolumeObject, volume_cachedInfoField, TRUE );
@@ -445,7 +438,7 @@ Java_org_openafs_jafs_Partition_getVolumesDone
 {
   afs_status_t ast;
 
-  if( !vos_VolumeGetDone( (void *) iterationId, &ast ) ) {
+  if ( !vos_VolumeGetDone( (void *) iterationId, &ast ) ) {
     throwAFSException( env, ast );
     return;
   }
@@ -456,27 +449,8 @@ JNIEXPORT void JNICALL
 Java_org_openafs_jafs_Partition_reclaimPartitionMemory
  (JNIEnv *env, jclass cls)
 {
-  if( partitionCls ) {
-      (*env)->DeleteGlobalRef(env, partitionCls);
-      partitionCls = 0;
+  if ( partitionCls ) {
+    (*env)->DeleteGlobalRef(env, partitionCls);
+    partitionCls = 0;
   }
 }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
index 25c0add24f7164e27868f4e8eeb44828a6965610..3da7e69847208c541e68467b8c0553bf9ec5b189 100644 (file)
@@ -26,7 +26,7 @@
 
 ///// definitions in Internal.c ////////////////////
 
-extern jclass processCls;
+extern jclass   processCls;
 extern jfieldID process_nameField;
 extern jfieldID process_typeField;
 extern jfieldID process_stateField;
@@ -52,9 +52,9 @@ extern jfieldID process_stateBadFileAccessField;
  * processName      the name of the process for which to get the info
  * process      the Process object to populate with the info
  */
-void getProcessInfoChar( JNIEnv *env, void *serverHandle, 
-                        const char *processName, jobject process ) {
-
+void getProcessInfoChar
+  (JNIEnv *env, void *serverHandle, const char *processName, jobject process)
+{
   afs_status_t ast;
   bos_ProcessType_t type;
   bos_ProcessInfo_t infoEntry;
@@ -62,11 +62,11 @@ void getProcessInfoChar( JNIEnv *env, void *serverHandle,
   char *auxStatus;
 
   // get class fields if need be
-  if( processCls == 0 ) {
+  if ( processCls == 0 ) {
     internal_getProcessClass( env, process );
   }
 
-  if( !bos_ProcessInfoGet( serverHandle, processName, &type, 
+  if ( !bos_ProcessInfoGet( serverHandle, processName, &type, 
                           &infoEntry, &ast ) ) {
     throwAFSException( env, ast );
     return;
@@ -116,17 +116,18 @@ void getProcessInfoChar( JNIEnv *env, void *serverHandle,
 
   // set state variable
   auxStatus = (char *) malloc( sizeof(char)*BOS_MAX_NAME_LEN );
-  if( !auxStatus ) {
+  if ( !auxStatus ) {
     throwAFSException( env, JAFSADMNOMEM );
     return;    
   }
-  if( !bos_ProcessExecutionStateGet( (void *) serverHandle, processName, 
+  if ( !bos_ProcessExecutionStateGet( (void *) serverHandle, processName, 
                                     &state, auxStatus, &ast ) ) {
       free( auxStatus );
       throwAFSException( env, ast );
       return;
   }
   free( auxStatus );
+
   switch( state ) {
   case BOS_PROCESS_STOPPED :
       (*env)->SetIntField(env, process, process_stateField, 
@@ -164,14 +165,14 @@ void getProcessInfoChar( JNIEnv *env, void *serverHandle,
                       infoEntry.processErrorSignal );
 
   // set stateOk to true if no core dump
-  if( infoEntry.state & BOS_PROCESS_CORE_DUMPED ) {
+  if ( infoEntry.state & BOS_PROCESS_CORE_DUMPED ) {
     (*env)->SetBooleanField(env, process, process_stateOkField, FALSE );
   } else {
     (*env)->SetBooleanField(env, process, process_stateOkField, TRUE );
   }
 
   // set stateTooManyErrors
-  if( infoEntry.state & BOS_PROCESS_TOO_MANY_ERRORS ) {
+  if ( infoEntry.state & BOS_PROCESS_TOO_MANY_ERRORS ) {
     (*env)->SetBooleanField(env, process, 
                            process_stateTooManyErrorsField, TRUE );
   } else {
@@ -180,7 +181,7 @@ void getProcessInfoChar( JNIEnv *env, void *serverHandle,
   }
 
   // set stateBadFileAccess
-  if( infoEntry.state & BOS_PROCESS_BAD_FILE_ACCESS ) {
+  if ( infoEntry.state & BOS_PROCESS_BAD_FILE_ACCESS ) {
     (*env)->SetBooleanField(env, process, 
                            process_stateBadFileAccessField, TRUE );
   } else {
@@ -202,34 +203,30 @@ void getProcessInfoChar( JNIEnv *env, void *serverHandle,
  *                    in the information
  */
 JNIEXPORT void JNICALL 
-Java_org_openafs_jafs_Process_getProcessInfo (JNIEnv *env, jclass cls, 
-                                                jint serverHandle, 
-                                                jstring jname, 
-                                                jobject process) {
-
-  const char *name;
-
-  if( jname != NULL ) {
-    name = (*env)->GetStringUTFChars(env, jname, 0);
-    if( !name ) {
+Java_org_openafs_jafs_Process_getProcessInfo 
+  (JNIEnv *env, jclass cls, jint serverHandle, jstring jname, jobject process)
+{
+  char *name;
+
+  if ( jname != NULL ) {
+    name = getNativeString(env, jname);
+    if ( name == NULL ) {
        throwAFSException( env, JAFSADMNOMEM );
        return;    
     }
   } else {
-    name = NULL;
+    throwAFSException( env, JAFSNULLPROCESS );
+    return;
   }
 
   getProcessInfoChar( env, (void *) serverHandle, name, process );
 
   // set name in case blank object
-  if( name != NULL ) {
-    if( processCls == 0 ) {
-      internal_getProcessClass( env, process );
-    }
-    (*env)->SetObjectField(env, process, process_nameField, jname);
-    (*env)->ReleaseStringUTFChars(env, jname, name);
+  if ( processCls == NULL ) {
+    internal_getProcessClass( env, process );
   }
-
+  (*env)->SetObjectField(env, process, process_nameField, jname);
+  free( name );
 }
 
 /**
@@ -258,132 +255,91 @@ Java_org_openafs_jafs_Process_getProcessInfo (JNIEnv *env, jclass cls,
  *                   null
  */
 JNIEXPORT void JNICALL 
-Java_org_openafs_jafs_Process_create (JNIEnv *env, jclass cls, 
-                                        jint serverHandle, jstring jname, 
-                                        jint jtype, jstring jpath, 
-                                        jstring jcronTime, 
-                                        jstring jnotifier) {
-
-    afs_status_t ast;
-    bos_ProcessType_t type;
-    const char *name;
-    const char *path;
-    const char *cronTime;
-    const char *notifier;
-
-    if( jname != NULL ) {
-      name = (*env)->GetStringUTFChars(env, jname, 0);
-      if( !name ) {
-         throwAFSException( env, JAFSADMNOMEM );
-         return;    
-      }
-    } else {
-      name = NULL;
-    }
-
-    if( jpath != NULL ) {
-      path = (*env)->GetStringUTFChars(env, jpath, 0);
-      if( !path ) {
-       if( name != NULL ) {
-         (*env)->ReleaseStringUTFChars(env, jname, name);
-       }
-       throwAFSException( env, JAFSADMNOMEM );
-       return;    
-      }
-    } else {
-      path = NULL;
+Java_org_openafs_jafs_Process_create 
+  (JNIEnv *env, jclass cls, jint serverHandle, jstring jname, jint jtype, 
+   jstring jpath, jstring jcronTime, jstring jnotifier)
+{
+  afs_status_t ast;
+  bos_ProcessType_t type;
+  char *name;
+  char *path;
+  char *cronTime;
+  char *notifier;
+
+  if ( jname != NULL ) {
+    name = getNativeString(env, jname);
+    if ( name == NULL ) {
+      throwAFSException( env, JAFSADMNOMEM );
+      return;    
     }
+  } else {
+    throwAFSException( env, JAFSNULLPROCESS );
+    return;
+  }
 
-    switch( jtype ) {
-    case org_openafs_jafs_Process_SIMPLE_PROCESS:
-       type = BOS_PROCESS_SIMPLE;
-       break;
-    case org_openafs_jafs_Process_FS_PROCESS:
-       type = BOS_PROCESS_FS;
-       break;
-    case org_openafs_jafs_Process_CRON_PROCESS:
-       type = BOS_PROCESS_CRON;
-       break;
-    default:
-      if( name != NULL ) {
-       (*env)->ReleaseStringUTFChars(env, jname, name);
-      }
-      if( path != NULL ) {
-       (*env)->ReleaseStringUTFChars(env, jpath, path);
-      }
-      throwAFSException( env, jtype );
-      return;
+  if ( jpath != NULL ) {
+    path = getNativeString(env, jpath);
+    if ( path == NULL ) {
+      free( name );
+      throwAFSException( env, JAFSADMNOMEM );
+      return;    
     }
+  } else {
+    path = NULL;
+  }
 
-    if( jcronTime != NULL ) {
-       cronTime = (*env)->GetStringUTFChars(env, jcronTime, 0);
-       if( !cronTime ) {
-         if( name != NULL ) {
-           (*env)->ReleaseStringUTFChars(env, jname, name);
-         }
-         if( path != NULL ) {
-           (*env)->ReleaseStringUTFChars(env, jpath, path);
-         }
-         throwAFSException( env, JAFSADMNOMEM );
-         return;    
-       }
-    } else {
-       cronTime = NULL;
-    }
+  switch( jtype ) {
+  case org_openafs_jafs_Process_SIMPLE_PROCESS:
+    type = BOS_PROCESS_SIMPLE;
+    break;
+  case org_openafs_jafs_Process_FS_PROCESS:
+    type = BOS_PROCESS_FS;
+    break;
+  case org_openafs_jafs_Process_CRON_PROCESS:
+    type = BOS_PROCESS_CRON;
+    break;
+  default:
+    free( name );
+    if ( path != NULL ) free( path );
+    throwAFSException( env, jtype );
+    return;
+  }
 
-    if( jnotifier != NULL ) {
-       notifier = (*env)->GetStringUTFChars(env, jnotifier, 0);
-       if( !notifier ) {
-         if( name != NULL ) {
-           (*env)->ReleaseStringUTFChars(env, jname, name);
-         }
-         if( path != NULL ) {
-           (*env)->ReleaseStringUTFChars(env, jpath, path);
-         }
-         if( cronTime != NULL ) {
-           (*env)->ReleaseStringUTFChars(env, jcronTime, cronTime);
-         }
-         throwAFSException( env, JAFSADMNOMEM );
-         return;    
-       }
-    } else {
-       notifier = NULL;
+  if ( jcronTime != NULL ) {
+    cronTime = getNativeString(env, jcronTime);
+    if ( !cronTime ) {
+      free( name );
+      if ( path != NULL ) free( path );
+      throwAFSException( env, JAFSADMNOMEM );
+      return;    
     }
+  } else {
+    cronTime = NULL;
+  }
 
-    if( !bos_ProcessCreate( (void *) serverHandle, name, type, path, 
-                           cronTime, notifier, &ast ) ) {
-       // release strings
-       if( cronTime != NULL ) {
-           (*env)->ReleaseStringUTFChars(env, jcronTime, cronTime);
-       }
-       if( notifier != NULL ) {
-           (*env)->ReleaseStringUTFChars(env, jnotifier, notifier);
-       }
-       if( name != NULL ) {
-         (*env)->ReleaseStringUTFChars(env, jname, name);
-       }
-       if( path != NULL ) {
-         (*env)->ReleaseStringUTFChars(env, jpath, path);
-       }
-       throwAFSException( env, ast );
-       return;
+  if ( jnotifier != NULL ) {
+    notifier = getNativeString(env, jnotifier);
+    if ( !notifier ) {
+      free( name );
+      if ( path != NULL )     free( path );
+      if ( cronTime != NULL ) free( cronTime );
+      throwAFSException( env, JAFSADMNOMEM );
+      return;    
     }
+  } else {
+    notifier = NULL;
+  }
 
+  if ( !bos_ProcessCreate( (void *) serverHandle, name, type, path, 
+                           cronTime, notifier, &ast ) ) {
+    throwAFSException( env, ast );
+  }
 
-    // release strings
-    if( cronTime != NULL ) {
-       (*env)->ReleaseStringUTFChars(env, jcronTime, cronTime);
-    }
-    if( notifier != NULL ) {
-       (*env)->ReleaseStringUTFChars(env, jnotifier, notifier);
-    }
-    if( name != NULL ) {
-      (*env)->ReleaseStringUTFChars(env, jname, name);
-    }
-    if( path != NULL ) {
-      (*env)->ReleaseStringUTFChars(env, jpath, path);
-    }
-
+  // release strings
+  free( name );
+  if ( path != NULL )     free( path );
+  if ( cronTime != NULL ) free( cronTime );
+  if ( notifier != NULL ) free( notifier );
 }
 
 /**
@@ -396,34 +352,28 @@ Java_org_openafs_jafs_Process_create (JNIEnv *env, jclass cls,
  * jname   the name of the process to remove
  */
 JNIEXPORT void JNICALL 
-Java_org_openafs_jafs_Process_delete (JNIEnv *env, jclass cls, 
-                                        jint serverHandle, jstring jname) {
-
-    afs_status_t ast;
-    const char *name;
-
-    if( jname != NULL ) {
-      name = (*env)->GetStringUTFChars(env, jname, 0);
-      if( !name ) {
-         throwAFSException( env, JAFSADMNOMEM );
-         return;    
-      }
-    } else {
-      name = NULL;
-    }
+Java_org_openafs_jafs_Process_delete 
+  (JNIEnv *env, jclass cls, jint serverHandle, jstring jname)
+{
+  afs_status_t ast;
+  char *name;
 
-    if( !bos_ProcessDelete( (void *) serverHandle, name, &ast ) ) {
-      if( name != NULL ) {
-       (*env)->ReleaseStringUTFChars(env, jname, name);
-      }
-      throwAFSException( env, ast );
-      return;
+  if ( jname != NULL ) {
+    name = getNativeString(env, jname);
+    if ( !name ) {
+      throwAFSException( env, JAFSADMNOMEM );
+      return;    
     }
+  } else {
+    throwAFSException( env, JAFSNULLPROCESS );
+    return;
+  }
 
-    if( name != NULL ) {
-      (*env)->ReleaseStringUTFChars(env, jname, name);
-    }
+  if ( !bos_ProcessDelete( (void *) serverHandle, name, &ast ) ) {
+    throwAFSException( env, ast );
+  }
 
+  free( name );
 }
 
 /**
@@ -436,35 +386,29 @@ Java_org_openafs_jafs_Process_delete (JNIEnv *env, jclass cls,
  * jname   the name of the process to stop
  */
 JNIEXPORT void JNICALL 
-Java_org_openafs_jafs_Process_stop (JNIEnv *env, jclass cls, 
-                                      jint serverHandle, jstring jname) {
-
-    afs_status_t ast;
-    const char *name;
-
-    if( jname != NULL ) {
-      name = (*env)->GetStringUTFChars(env, jname, 0);
-      if( !name ) {
-         throwAFSException( env, JAFSADMNOMEM );
-         return;    
-      }
-    } else {
-      name = NULL;
-    }
+Java_org_openafs_jafs_Process_stop 
+  (JNIEnv *env, jclass cls, jint serverHandle, jstring jname)
+{
+  afs_status_t ast;
+  char *name;
 
-    if( !bos_ProcessExecutionStateSet( (void *) serverHandle, name, 
-                                      BOS_PROCESS_STOPPED, &ast ) ) {
-      if( name != NULL ) {
-       (*env)->ReleaseStringUTFChars(env, jname, name);
-      }
-      throwAFSException( env, ast );
-      return;
+  if ( jname != NULL ) {
+    name = getNativeString(env, jname);
+    if ( !name ) {
+      throwAFSException( env, JAFSADMNOMEM );
+      return;    
     }
+  } else {
+    throwAFSException( env, JAFSNULLPROCESS );
+    return;
+  }
 
-    if( name != NULL ) {
-      (*env)->ReleaseStringUTFChars(env, jname, name);
-    }
+  if ( !bos_ProcessExecutionStateSet( (void *) serverHandle, name, 
+                                      BOS_PROCESS_STOPPED, &ast ) ) {
+    throwAFSException( env, ast );
+  }
 
+  free( name );
 }
 
 /**
@@ -477,35 +421,29 @@ Java_org_openafs_jafs_Process_stop (JNIEnv *env, jclass cls,
  * jname   the name of the process to start
  */
 JNIEXPORT void JNICALL 
-Java_org_openafs_jafs_Process_start (JNIEnv *env, jclass cls, 
-                                       jint serverHandle, jstring jname) {
-
-    afs_status_t ast;
-    const char *name;
-
-    if( jname != NULL ) {
-      name = (*env)->GetStringUTFChars(env, jname, 0);
-      if( !name ) {
-         throwAFSException( env, JAFSADMNOMEM );
-         return;    
-      }
-    } else {
-      name = NULL;
-    }
+Java_org_openafs_jafs_Process_start 
+  (JNIEnv *env, jclass cls, jint serverHandle, jstring jname)
+{
+  afs_status_t ast;
+  char *name;
 
-    if( !bos_ProcessExecutionStateSet( (void *) serverHandle, name, 
-                                      BOS_PROCESS_RUNNING, &ast ) ) {
-      if( name != NULL ) {
-       (*env)->ReleaseStringUTFChars(env, jname, name);
-      }
-      throwAFSException( env, ast );
-      return;
+  if ( jname != NULL ) {
+    name = getNativeString(env, jname);
+    if ( !name ) {
+      throwAFSException( env, JAFSADMNOMEM );
+      return;    
     }
+  } else {
+    throwAFSException( env, JAFSNULLPROCESS );
+    return;
+  }
 
-    if( name != NULL ) {
-      (*env)->ReleaseStringUTFChars(env, jname, name);
-    }
+  if ( !bos_ProcessExecutionStateSet( (void *) serverHandle, name, 
+                                      BOS_PROCESS_RUNNING, &ast ) ) {
+    throwAFSException( env, ast );
+  }
 
+  free( name );
 }
 
 /**
@@ -518,50 +456,37 @@ Java_org_openafs_jafs_Process_start (JNIEnv *env, jclass cls,
  * jname   the name of the process to restart
  */
 JNIEXPORT void JNICALL 
-Java_org_openafs_jafs_Process_restart (JNIEnv *env, jclass cls, 
-                                         jint serverHandle, jstring jname) {
-
-    afs_status_t ast;
-    const char *name;
-
-    if( jname != NULL ) {
-      name = (*env)->GetStringUTFChars(env, jname, 0);
-      if( !name ) {
-         throwAFSException( env, JAFSADMNOMEM );
-         return;    
-      }
-    } else {
-      name = NULL;
-    }
+Java_org_openafs_jafs_Process_restart 
+  (JNIEnv *env, jclass cls, jint serverHandle, jstring jname)
+{
+  afs_status_t ast;
+  char *name;
 
-    if( !bos_ProcessRestart( (void *) serverHandle, name, &ast ) ) {
-      if( name != NULL ) {
-       (*env)->ReleaseStringUTFChars(env, jname, name);
-      }
-      throwAFSException( env, ast );
-      return;
+  if ( jname != NULL ) {
+    name = getNativeString(env, jname);
+    if ( !name ) {
+      throwAFSException( env, JAFSADMNOMEM );
+      return;    
     }
+  } else {
+    throwAFSException( env, JAFSNULLPROCESS );
+    return;
+  }
 
-    if( name != NULL ) {
-      (*env)->ReleaseStringUTFChars(env, jname, name);
-    }
+  if ( !bos_ProcessRestart( (void *) serverHandle, name, &ast ) ) {
+    throwAFSException( env, ast );
+  }
 
+  free( name );
 }
 
 // reclaim global memory being used by this portion
 JNIEXPORT void JNICALL
-Java_org_openafs_jafs_Process_reclaimProcessMemory (JNIEnv *env, 
-                                                      jclass cls) {
-
-  if( processCls ) {
-      (*env)->DeleteGlobalRef(env, processCls);
-      processCls = 0;
+Java_org_openafs_jafs_Process_reclaimProcessMemory 
+  (JNIEnv *env, jclass cls)
+{
+  if ( processCls ) {
+    (*env)->DeleteGlobalRef(env, processCls);
+    processCls = 0;
   }
-
 }
-
-
-
-
-
-
index ce3f504c6e1d4f0bcb956c8b7fc690f690dc7ffb..24bb89427d5d6ff5a07107944c408e66c84649f3 100644 (file)
@@ -102,7 +102,7 @@ void fillServerInfo
   int i = 0;
 
   // get the class fields if need be
-  if( serverCls == 0 ) {
+  if ( serverCls == 0 ) {
     internal_getServerClass( env, server );
   }
 
@@ -114,20 +114,19 @@ void fillServerInfo
   jaddresses = (jobjectArray) (*env)->GetObjectField( env, server, 
                                                      server_IPAddressField );
   for (i = 0; i < 16; i++) {
-       if (servEntry.serverAddress[i] != 0) {
-         jip = 
-           (*env)->NewStringUTF(env, (char *) 
-                                inet_ntoa(htonl(servEntry.serverAddress[i])));
+    if (servEntry.serverAddress[i] != 0) {
+      jip = (*env)->NewStringUTF(env, (char *) 
+                                 inet_ntoa(htonl(servEntry.serverAddress[i])));
       (*env)->SetObjectArrayElement(env, jaddresses, i, jip);
-       } else {
-         break;
-       }
+    } else {
+      break;
+    }
   }
 
   // let's check if this is really a database server
   (*env)->SetBooleanField(env, server, server_databaseField, 
                          servEntry.serverType & DATABASE_SERVER);
-  if( servEntry.serverType & DATABASE_SERVER ) {
+  if ( servEntry.serverType & DATABASE_SERVER ) {
     // for now, if it thinks it's a database server than it is
     // later, add checks for database configuration, and actual 
     // on-ness of the machine
@@ -142,7 +141,7 @@ void fillServerInfo
   // if it is a file server, mark it as such.  If not, mark it as faulty.
   (*env)->SetBooleanField(env, server, server_fileServerField,  
                          servEntry.serverType & FILE_SERVER);
-  if( servEntry.serverType & FILE_SERVER ) {
+  if ( servEntry.serverType & FILE_SERVER ) {
     
     // to see if it's really a file server, make sure the 
     // "fs" process is running
@@ -155,16 +154,16 @@ void fillServerInfo
     // set the file server to true (it thinks it's a file server)
     (*env)->SetBooleanField(env, server, server_fileServerField, TRUE);
 
-    if( !bos_ServerOpen( (void *) cellHandle, servEntry.serverName, 
+    if ( !bos_ServerOpen( (void *) cellHandle, servEntry.serverName, 
                         &bosHandle, &ast ) ) {
       throwAFSException( env, ast );
       return;
     }
-    if( !bos_ProcessInfoGet( bosHandle, fileServerProcessName, &processTypeT, 
+    if ( !bos_ProcessInfoGet( bosHandle, fileServerProcessName, &processTypeT, 
                             &processInfoT, &ast ) ) {
       // if the machine does not have a fs process or is not responding 
       // or is part of another cell
-      if( ast == BZNOENT || ast == -1 || ast == RXKADBADTICKET ) {
+      if ( ast == BZNOENT || ast == -1 || ast == RXKADBADTICKET ) {
         (*env)->SetBooleanField(env, server, server_badFileServerField, TRUE);
       // otherwise
       } else {
@@ -192,40 +191,33 @@ void fillServerInfo
  *                   the information
  */
 JNIEXPORT void JNICALL 
-Java_org_openafs_jafs_Server_getServerInfo (JNIEnv *env, jclass cls, 
-                                              jint cellHandle, jstring jname, 
-                                              jobject server) {
-
-  const char *name;
+Java_org_openafs_jafs_Server_getServerInfo 
+  (JNIEnv *env, jclass cls, jint cellHandle, jstring jname, jobject server)
+{
+  char *name;
   afs_status_t ast;
   afs_serverEntry_t servEntry;
 
-  if( jname != NULL ) {
-    name = (*env)->GetStringUTFChars(env, jname, 0);
-    if( !name ) {
+  if ( jname != NULL ) {
+    name = getNativeString(env, jname);
+    if ( name == NULL ) {
        throwAFSException( env, JAFSADMNOMEM );
        return;    
     }
   } else {
-    name = NULL;
+    throwAFSException( env, JAFSNULLSERVER );
+    return;
   }
 
   // get the server entry
   if ( !afsclient_AFSServerGet( (void *) cellHandle, name, 
                                &servEntry, &ast ) ) {
-    if( name != NULL ) {
-      (*env)->ReleaseStringUTFChars(env, jname, name);
-    }
     throwAFSException( env, ast );
-    return;
   }
 
   fillServerInfo( env, cellHandle, server, servEntry );
 
-  if( name != NULL ) {
-    (*env)->ReleaseStringUTFChars(env, jname, name);
-  }
-
+  free( name );
 }
 
 /**
@@ -240,16 +232,15 @@ Java_org_openafs_jafs_Server_getServerInfo (JNIEnv *env, jclass cls,
  * returns total number of partitions
  */
 JNIEXPORT jint JNICALL 
-Java_org_openafs_jafs_Server_getPartitionCount (JNIEnv *env, jclass cls, 
-                                                  jint cellHandle, 
-                                                  jint serverHandle) {
-
+Java_org_openafs_jafs_Server_getPartitionCount 
+  (JNIEnv *env, jclass cls, jint cellHandle, jint serverHandle)
+{
   afs_status_t ast;
   void *iterationId;
   vos_partitionEntry_t partEntry;
   int i = 0;
 
-  if( !vos_PartitionGetBegin( (void *) cellHandle, (void *) serverHandle, 
+  if ( !vos_PartitionGetBegin( (void *) cellHandle, (void *) serverHandle, 
                              NULL, &iterationId, &ast ) ) {
     throwAFSException( env, ast );
     return -1;
@@ -257,7 +248,7 @@ Java_org_openafs_jafs_Server_getPartitionCount (JNIEnv *env, jclass cls,
 
   while ( vos_PartitionGetNext( (void *) iterationId, &partEntry, &ast ) ) i++;
 
-  if( ast != ADMITERATORDONE ) {
+  if ( ast != ADMITERATORDONE ) {
     throwAFSException( env, ast );
     return -1;
   }
@@ -278,14 +269,13 @@ Java_org_openafs_jafs_Server_getPartitionCount (JNIEnv *env, jclass cls,
  * returns an iteration ID
  */
 JNIEXPORT jint JNICALL 
-Java_org_openafs_jafs_Server_getPartitionsBegin (JNIEnv *env, jclass cls, 
-                                                   jint cellHandle, 
-                                                   jint serverHandle) {
-
+Java_org_openafs_jafs_Server_getPartitionsBegin 
+  (JNIEnv *env, jclass cls, jint cellHandle, jint serverHandle)
+{
   afs_status_t ast;
   void *iterationId;
 
-  if( !vos_PartitionGetBegin( (void *) cellHandle, (void *) serverHandle, 
+  if ( !vos_PartitionGetBegin( (void *) cellHandle, (void *) serverHandle, 
                              NULL, &iterationId, &ast ) ) {
     throwAFSException( env, ast );
     return;
@@ -305,16 +295,15 @@ Java_org_openafs_jafs_Server_getPartitionsBegin (JNIEnv *env, jclass cls,
  * returns the name of the next partition of the server
  */
 JNIEXPORT jstring JNICALL 
-Java_org_openafs_jafs_Server_getPartitionsNextString (JNIEnv *env, 
-                                                        jclass cls, 
-                                                        jint iterationId) {
-
+Java_org_openafs_jafs_Server_getPartitionsNextString 
+  (JNIEnv *env, jclass cls, jint iterationId)
+{
   afs_status_t ast;
   jstring jpartition;
   vos_partitionEntry_t partEntry;
 
-  if( !vos_PartitionGetNext( (void *) iterationId, &partEntry, &ast ) ) {
-    if( ast == ADMITERATORDONE ) {
+  if ( !vos_PartitionGetNext( (void *) iterationId, &partEntry, &ast ) ) {
+    if ( ast == ADMITERATORDONE ) {
       return NULL;
     } else {
       throwAFSException( env, ast );
@@ -339,15 +328,14 @@ Java_org_openafs_jafs_Server_getPartitionsNextString (JNIEnv *env,
  * returns 0 if there are no more servers, != 0 otherwise
  */
 JNIEXPORT jint JNICALL 
-Java_org_openafs_jafs_Server_getPartitionsNext (JNIEnv *env, jclass cls, 
-                                                  jint iterationId, 
-                                                  jobject jpartitionObject) {
-    
+Java_org_openafs_jafs_Server_getPartitionsNext 
+  (JNIEnv *env, jclass cls, jint iterationId, jobject jpartitionObject)
+{
   afs_status_t ast;
   vos_partitionEntry_t partEntry;
 
-  if( !vos_PartitionGetNext( (void *) iterationId, &partEntry, &ast ) ) {
-    if( ast == ADMITERATORDONE ) {
+  if ( !vos_PartitionGetNext( (void *) iterationId, &partEntry, &ast ) ) {
+    if ( ast == ADMITERATORDONE ) {
       return 0;
     } else {
       throwAFSException( env, ast );
@@ -358,7 +346,7 @@ Java_org_openafs_jafs_Server_getPartitionsNext (JNIEnv *env, jclass cls,
   fillPartitionInfo( env, jpartitionObject, partEntry );
 
   // get the class fields if need be
-  if( partitionCls == 0 ) {
+  if ( partitionCls == 0 ) {
     internal_getPartitionClass( env, jpartitionObject );
   }
   (*env)->SetBooleanField( env, jpartitionObject, partition_cachedInfoField, 
@@ -377,12 +365,12 @@ Java_org_openafs_jafs_Server_getPartitionsNext (JNIEnv *env, jclass cls,
  * iterationId   the iteration ID of this iteration
  */
 JNIEXPORT void JNICALL 
-Java_org_openafs_jafs_Server_getPartitionsDone (JNIEnv *env, jclass cls, 
-                                                  jint iterationId) {
-
+Java_org_openafs_jafs_Server_getPartitionsDone 
+  (JNIEnv *env, jclass cls, jint iterationId)
+{
   afs_status_t ast;
 
-  if( !vos_PartitionGetDone( (void *) iterationId, &ast ) ) {
+  if ( !vos_PartitionGetDone( (void *) iterationId, &ast ) ) {
     throwAFSException( env, ast );
     return;
   }
@@ -399,34 +387,28 @@ Java_org_openafs_jafs_Server_getPartitionsDone (JNIEnv *env, jclass cls,
  * jnewAdmin   the name of the admin to add to the list
  */
 JNIEXPORT void JNICALL 
-Java_org_openafs_jafs_Server_addBosAdmin (JNIEnv *env, jclass cls, 
-                                            jint serverHandle, 
-                                            jstring jnewAdmin) {
-
+Java_org_openafs_jafs_Server_addBosAdmin 
+  (JNIEnv *env, jclass cls, jint serverHandle, jstring jnewAdmin)
+{
   afs_status_t ast;
-  const char *newAdmin;
+  char *newAdmin;
 
-  if( jnewAdmin != NULL ) {
-    newAdmin = (*env)->GetStringUTFChars(env, jnewAdmin, 0);
-    if( !newAdmin ) {
+  if ( jnewAdmin != NULL ) {
+    newAdmin = getNativeString(env, jnewAdmin);
+    if ( newAdmin == NULL ) {
        throwAFSException( env, JAFSADMNOMEM );
        return;    
     }
   } else {
-    newAdmin = NULL;
+    throwAFSException( env, JAFSNULLUSER );
+    return;
   }
 
-  if( !bos_AdminCreate( (void *) serverHandle, newAdmin, &ast ) ) {
-    if( newAdmin != NULL ) {
-      (*env)->ReleaseStringUTFChars(env, jnewAdmin, newAdmin);
-    }
+  if ( !bos_AdminCreate( (void *) serverHandle, newAdmin, &ast ) ) {
     throwAFSException( env, ast );
-    return;
   }
 
-  if( newAdmin != NULL ) {
-    (*env)->ReleaseStringUTFChars(env, jnewAdmin, newAdmin);
-  }
+  free( newAdmin );
 
 }
 
@@ -441,35 +423,28 @@ Java_org_openafs_jafs_Server_addBosAdmin (JNIEnv *env, jclass cls,
  * joldAdmin   the name of the admin to remove from the list
  */
 JNIEXPORT void JNICALL 
-Java_org_openafs_jafs_Server_removeBosAdmin (JNIEnv *env, jclass cls, 
-                                               jint serverHandle, 
-                                               jstring joldAdmin) {
-
+Java_org_openafs_jafs_Server_removeBosAdmin 
+  (JNIEnv *env, jclass cls, jint serverHandle, jstring joldAdmin)
+{
   afs_status_t ast;
-  const char *oldAdmin;
+  char *oldAdmin;
 
-  if( joldAdmin != NULL ) {
-    oldAdmin = (*env)->GetStringUTFChars(env, joldAdmin, 0);
-    if( !oldAdmin ) {
+  if ( joldAdmin != NULL ) {
+    oldAdmin = getNativeString(env, joldAdmin);
+    if ( oldAdmin == NULL ) {
        throwAFSException( env, JAFSADMNOMEM );
        return;    
     }
   } else {
-    oldAdmin = NULL;
-  }
-
-  if( !bos_AdminDelete( (void *) serverHandle, oldAdmin, &ast ) ) {
-    if( oldAdmin != NULL ) {
-      (*env)->ReleaseStringUTFChars(env, joldAdmin, oldAdmin);
-    }
-    throwAFSException( env, ast );
+    throwAFSException( env, JAFSNULLUSER );
     return;
   }
 
-  if( oldAdmin != NULL ) {
-    (*env)->ReleaseStringUTFChars(env, joldAdmin, oldAdmin);
+  if ( !bos_AdminDelete( (void *) serverHandle, oldAdmin, &ast ) ) {
+    throwAFSException( env, ast );
   }
 
+  free( oldAdmin );
 }
 
 /**
@@ -483,32 +458,32 @@ Java_org_openafs_jafs_Server_removeBosAdmin (JNIEnv *env, jclass cls,
  * returns total number of BOS administrators
  */
 JNIEXPORT jint JNICALL 
-Java_org_openafs_jafs_Server_getBosAdminCount (JNIEnv *env, jclass cls, 
-                                                 jint serverHandle) {
-
+Java_org_openafs_jafs_Server_getBosAdminCount 
+  (JNIEnv *env, jclass cls, jint serverHandle)
+{
   afs_status_t ast;
   void *iterationId;
   char *admin;
   jstring jadmin;
   int i = 0;
 
-  if( !bos_AdminGetBegin( (void *) serverHandle, &iterationId, &ast ) ) {
+  if ( !bos_AdminGetBegin( (void *) serverHandle, &iterationId, &ast ) ) {
     throwAFSException( env, ast );
     return -1;
   }
 
   admin = (char *) malloc( sizeof(char)*BOS_MAX_NAME_LEN);
 
-  if( !admin ) {
+  if ( !admin ) {
     throwAFSException( env, JAFSADMNOMEM );
     return -1;
   }
 
   while ( bos_AdminGetNext( (void *) iterationId, admin, &ast ) ) i++;
 
-  free(admin);
+  free( admin );
 
-  if( ast != ADMITERATORDONE ) {
+  if ( ast != ADMITERATORDONE ) {
     throwAFSException( env, ast );
     return -1;
   }
@@ -528,19 +503,18 @@ Java_org_openafs_jafs_Server_getBosAdminCount (JNIEnv *env, jclass cls,
  * returns an iteration ID
  */
 JNIEXPORT jint JNICALL 
-Java_org_openafs_jafs_Server_getBosAdminsBegin (JNIEnv *env, jclass cls, 
-                                                  jint serverHandle) {
-
+Java_org_openafs_jafs_Server_getBosAdminsBegin 
+  (JNIEnv *env, jclass cls, jint serverHandle)
+{
   afs_status_t ast;
   void *iterationId;
 
-  if( !bos_AdminGetBegin( (void *) serverHandle, &iterationId, &ast ) ) {
+  if ( !bos_AdminGetBegin( (void *) serverHandle, &iterationId, &ast ) ) {
     throwAFSException( env, ast );
     return;
   }
 
   return (jint) iterationId;
-
 }
 
 /**
@@ -553,22 +527,21 @@ Java_org_openafs_jafs_Server_getBosAdminsBegin (JNIEnv *env, jclass cls,
  * returns the name of the next admin of the server
  */
 JNIEXPORT jstring JNICALL 
-Java_org_openafs_jafs_Server_getBosAdminsNextString (JNIEnv *env, 
-                                                       jclass cls, 
-                                                       jint iterationId) {
+Java_org_openafs_jafs_Server_getBosAdminsNextString 
+  (JNIEnv *env, jclass cls, jint iterationId) {
 
   afs_status_t ast;
   jstring jadmin;
   char *admin = (char *) malloc( sizeof(char)*BOS_MAX_NAME_LEN );
 
-  if( !admin ) {
+  if ( !admin ) {
     throwAFSException( env, JAFSADMNOMEM );
     return;    
   }
 
-  if( !bos_AdminGetNext( (void *) iterationId, admin, &ast ) ) {
-    free(admin);
-    if( ast == ADMITERATORDONE ) {
+  if ( !bos_AdminGetNext( (void *) iterationId, admin, &ast ) ) {
+    free( admin );
+    if ( ast == ADMITERATORDONE ) {
       return NULL;
     } else {
       throwAFSException( env, ast );
@@ -577,7 +550,7 @@ Java_org_openafs_jafs_Server_getBosAdminsNextString (JNIEnv *env,
   }
 
   jadmin = (*env)->NewStringUTF(env, admin);
-  free(admin);
+  free( admin );
   return jadmin;
 
 }
@@ -594,25 +567,24 @@ Java_org_openafs_jafs_Server_getBosAdminsNextString (JNIEnv *env,
  * returns 0 if no more admins, != 0 otherwise
  */
 JNIEXPORT jint JNICALL 
-Java_org_openafs_jafs_Server_getBosAdminsNext (JNIEnv *env, jclass cls, 
-                                                 jint cellHandle, 
-                                                 jint iterationId, 
-                                                 jobject juserObject ) {
-    
+Java_org_openafs_jafs_Server_getBosAdminsNext 
+  (JNIEnv *env, jclass cls, jint cellHandle, jint iterationId, 
+   jobject juserObject )
+{
   afs_status_t ast;
   char *admin;
   jstring jadmin;
 
   admin = (char *) malloc( sizeof(char)*BOS_MAX_NAME_LEN);
 
-  if( !admin ) {
+  if ( !admin ) {
     throwAFSException( env, JAFSADMNOMEM );
     return;    
   }
 
-  if( !bos_AdminGetNext( (void *) iterationId, admin, &ast ) ) {
+  if ( !bos_AdminGetNext( (void *) iterationId, admin, &ast ) ) {
     free( admin );
-    if( ast == ADMITERATORDONE ) {
+    if ( ast == ADMITERATORDONE ) {
       return 0;
     } else {
       throwAFSException( env, ast );
@@ -622,7 +594,7 @@ Java_org_openafs_jafs_Server_getBosAdminsNext (JNIEnv *env, jclass cls,
 
   jadmin = (*env)->NewStringUTF(env, admin);
 
-  if( userCls == 0 ) {
+  if ( userCls == 0 ) {
     internal_getUserClass( env, juserObject );
   }
 
@@ -644,16 +616,15 @@ Java_org_openafs_jafs_Server_getBosAdminsNext (JNIEnv *env, jclass cls,
  * iterationId   the iteration ID of this iteration
  */
 JNIEXPORT void JNICALL 
-Java_org_openafs_jafs_Server_getBosAdminsDone (JNIEnv *env, jclass cls, 
-                                                 jint iterationId) {
-
+Java_org_openafs_jafs_Server_getBosAdminsDone 
+  (JNIEnv *env, jclass cls, jint iterationId)
+{
   afs_status_t ast;
 
-  if( !bos_AdminGetDone( (void *) iterationId, &ast ) ) {
+  if ( !bos_AdminGetDone( (void *) iterationId, &ast ) ) {
     throwAFSException( env, ast );
     return;
   }
-
 }
 
 /**
@@ -667,22 +638,22 @@ Java_org_openafs_jafs_Server_getBosAdminsDone (JNIEnv *env, jclass cls,
  * returns total number of keys
  */
 JNIEXPORT jint JNICALL 
-Java_org_openafs_jafs_Server_getKeyCount (JNIEnv *env, jclass cls, 
-                                            jint serverHandle) {
-
+Java_org_openafs_jafs_Server_getKeyCount 
+  (JNIEnv *env, jclass cls, jint serverHandle)
+{
   afs_status_t ast;
   void *iterationId;
   bos_KeyInfo_t keyEntry;
   int i = 0;
 
-  if( !bos_KeyGetBegin( (void *) serverHandle, &iterationId, &ast ) ) {
+  if ( !bos_KeyGetBegin( (void *) serverHandle, &iterationId, &ast ) ) {
     throwAFSException( env, ast );
     return -1;
   }
 
   while ( bos_KeyGetNext( (void *) iterationId, &keyEntry, &ast ) ) i++;
 
-  if( ast != ADMITERATORDONE ) {
+  if ( ast != ADMITERATORDONE ) {
     throwAFSException( env, ast );
     return -1;
   }
@@ -701,19 +672,18 @@ Java_org_openafs_jafs_Server_getKeyCount (JNIEnv *env, jclass cls,
  * returns an iteration ID
  */
 JNIEXPORT jint JNICALL 
-Java_org_openafs_jafs_Server_getKeysBegin (JNIEnv *env, jclass cls, 
-                                             jint serverHandle) {
-
+Java_org_openafs_jafs_Server_getKeysBegin 
+  (JNIEnv *env, jclass cls, jint serverHandle)
+{
   afs_status_t ast;
   void *iterationId;
 
-  if( !bos_KeyGetBegin( (void *) serverHandle, &iterationId, &ast ) ) {
+  if ( !bos_KeyGetBegin( (void *) serverHandle, &iterationId, &ast ) ) {
     throwAFSException( env, ast );
     return;
   }
 
   return (jint) iterationId;
-
 }
 
 /**
@@ -728,15 +698,15 @@ Java_org_openafs_jafs_Server_getKeysBegin (JNIEnv *env, jclass cls,
  * returns 0 if there are no more keys, != 0 otherwise
  */
 JNIEXPORT jint JNICALL 
-Java_org_openafs_jafs_Server_getKeysNext (JNIEnv *env, jclass cls, 
-                                            jint iterationId, 
-                                            jobject jkeyObject) {
+Java_org_openafs_jafs_Server_getKeysNext 
+  (JNIEnv *env, jclass cls, jint iterationId, jobject jkeyObject)
+{
     
   afs_status_t ast;
   bos_KeyInfo_t keyEntry;
 
-  if( !bos_KeyGetNext( (void *) iterationId, &keyEntry, &ast ) ) {
-    if( ast == ADMITERATORDONE ) {
+  if ( !bos_KeyGetNext( (void *) iterationId, &keyEntry, &ast ) ) {
+    if ( ast == ADMITERATORDONE ) {
       return 0;
     } else {
       throwAFSException( env, ast );
@@ -747,14 +717,13 @@ Java_org_openafs_jafs_Server_getKeysNext (JNIEnv *env, jclass cls,
   fillKeyInfo( env, jkeyObject, keyEntry );
 
   // get the class fields if need be
-  if( keyCls == 0 ) {
+  if ( keyCls == 0 ) {
     internal_getKeyClass( env, jkeyObject );
   }
 
   (*env)->SetBooleanField( env, jkeyObject, key_cachedInfoField, TRUE );
 
   return 1;
-
 }
 
 /**
@@ -765,16 +734,15 @@ Java_org_openafs_jafs_Server_getKeysNext (JNIEnv *env, jclass cls,
  * iterationId   the iteration ID of this iteration
  */
 JNIEXPORT void JNICALL 
-Java_org_openafs_jafs_Server_getKeysDone (JNIEnv *env, jclass cls, 
-                                            jint iterationId) {
-
+Java_org_openafs_jafs_Server_getKeysDone 
+  (JNIEnv *env, jclass cls, jint iterationId)
+{
   afs_status_t ast;
 
-  if( !bos_KeyGetDone( (void *) iterationId, &ast ) ) {
+  if ( !bos_KeyGetDone( (void *) iterationId, &ast ) ) {
     throwAFSException( env, ast );
     return;
   }
-
 }
 
 /**
@@ -788,23 +756,23 @@ Java_org_openafs_jafs_Server_getKeysDone (JNIEnv *env, jclass cls,
  * returns total number of processes
  */
 JNIEXPORT jint JNICALL 
-Java_org_openafs_jafs_Server_getProcessCount (JNIEnv *env, jclass cls, 
-                                                jint serverHandle) {
-
+Java_org_openafs_jafs_Server_getProcessCount 
+  (JNIEnv *env, jclass cls, jint serverHandle)
+{
   afs_status_t ast;
   void *iterationId;
   char *process;
   jstring jprocess;
   int i = 0;
 
-  if( !bos_ProcessNameGetBegin( (void *) serverHandle, &iterationId, &ast ) ) {
+  if ( !bos_ProcessNameGetBegin( (void *) serverHandle, &iterationId, &ast ) ) {
     throwAFSException( env, ast );
     return -1;
   }
 
   process = (char *) malloc( sizeof(char)*BOS_MAX_NAME_LEN );
 
-  if( !process ) {
+  if ( !process ) {
     throwAFSException( env, JAFSADMNOMEM );
     return -1;
   }
@@ -813,7 +781,7 @@ Java_org_openafs_jafs_Server_getProcessCount (JNIEnv *env, jclass cls,
 
   free( process );
 
-  if( ast != ADMITERATORDONE ) {
+  if ( ast != ADMITERATORDONE ) {
     throwAFSException( env, ast );
     return -1;
   }
@@ -833,19 +801,18 @@ Java_org_openafs_jafs_Server_getProcessCount (JNIEnv *env, jclass cls,
  * returns an iteration ID
  */
 JNIEXPORT jint JNICALL 
-Java_org_openafs_jafs_Server_getProcessesBegin (JNIEnv *env, jclass cls, 
-                                                  jint serverHandle) {
-
+Java_org_openafs_jafs_Server_getProcessesBegin 
+  (JNIEnv *env, jclass cls, jint serverHandle)
+{
   afs_status_t ast;
   void *iterationId;
 
-  if( !bos_ProcessNameGetBegin( (void *) serverHandle, &iterationId, &ast ) ) {
+  if ( !bos_ProcessNameGetBegin( (void *) serverHandle, &iterationId, &ast ) ) {
     throwAFSException( env, ast );
     return;
   }
 
   return (jint) iterationId;
-
 }
 
 /**
@@ -858,22 +825,21 @@ Java_org_openafs_jafs_Server_getProcessesBegin (JNIEnv *env, jclass cls,
  * returns the name of the next process of the cell
  */
 JNIEXPORT jstring JNICALL 
-Java_org_openafs_jafs_Server_getProcessesNextString (JNIEnv *env, 
-                                                       jclass cls, 
-                                                       jint iterationId) {
-
+Java_org_openafs_jafs_Server_getProcessesNextString 
+  (JNIEnv *env, jclass cls, jint iterationId)
+{
   afs_status_t ast;
   jstring jprocess;
   char *process = (char *) malloc( sizeof(char)*BOS_MAX_NAME_LEN );
 
-  if( !process ) {
+  if ( !process ) {
     throwAFSException( env, JAFSADMNOMEM );
     return;    
   }
 
-  if( !bos_ProcessNameGetNext( (void *) iterationId, process, &ast ) ) {
+  if ( !bos_ProcessNameGetNext( (void *) iterationId, process, &ast ) ) {
     free( process );
-    if( ast == ADMITERATORDONE ) {
+    if ( ast == ADMITERATORDONE ) {
       return NULL;
     } else {
       throwAFSException( env, ast );
@@ -884,7 +850,6 @@ Java_org_openafs_jafs_Server_getProcessesNextString (JNIEnv *env,
   jprocess = (*env)->NewStringUTF(env, process);
   free( process );
   return jprocess;
-
 }
 
 /**
@@ -900,32 +865,31 @@ Java_org_openafs_jafs_Server_getProcessesNextString (JNIEnv *env,
  * returns 0 if there are no more processes, != otherwise
  */
 JNIEXPORT jint JNICALL 
-Java_org_openafs_jafs_Server_getProcessesNext (JNIEnv *env, jclass cls, 
-                                                 jint serverHandle, 
-                                                 jint iterationId, 
-                                                 jobject jprocessObject) {
-    
+Java_org_openafs_jafs_Server_getProcessesNext 
+  (JNIEnv *env, jclass cls, jint serverHandle, jint iterationId, 
+   jobject jprocessObject)
+{
   afs_status_t ast;
   char *process = (char *) malloc( sizeof(char)*BOS_MAX_NAME_LEN );
   jstring jprocess;
 
-  if( !process ) {
+  if ( !process ) {
     throwAFSException( env, JAFSADMNOMEM );
     return;    
   }
 
-  if( !bos_ProcessNameGetNext( (void *) iterationId, process, &ast ) ) {
-    if( ast == ADMITERATORDONE ) {
+  if ( !bos_ProcessNameGetNext( (void *) iterationId, process, &ast ) ) {
+    free( process );
+    if ( ast == ADMITERATORDONE ) {
       return 0;
     } else {
-      free( process );
       throwAFSException( env, ast );
       return 0;
     }
   }
 
   // get the class fields if need be
-  if( processCls == 0 ) {
+  if ( processCls == 0 ) {
     internal_getProcessClass( env, jprocessObject );
   }
 
@@ -939,7 +903,6 @@ Java_org_openafs_jafs_Server_getProcessesNext (JNIEnv *env, jclass cls,
 
   free( process );
   return 1;
-
 }
 
 /**
@@ -950,16 +913,15 @@ Java_org_openafs_jafs_Server_getProcessesNext (JNIEnv *env, jclass cls,
  * iterationId   the iteration ID of this iteration
  */
 JNIEXPORT void JNICALL 
-Java_org_openafs_jafs_Server_getProcessesDone (JNIEnv *env, jclass cls, 
-                                                 jint iterationId) {
-
+Java_org_openafs_jafs_Server_getProcessesDone 
+  (JNIEnv *env, jclass cls, jint iterationId)
+{
   afs_status_t ast;
 
-  if( !bos_ProcessNameGetDone( (void *) iterationId, &ast ) ) {
+  if ( !bos_ProcessNameGetDone( (void *) iterationId, &ast ) ) {
     throwAFSException( env, ast );
     return;
   }
-
 }
 
 /**
@@ -995,23 +957,27 @@ Java_org_openafs_jafs_Server_getProcessesDone (JNIEnv *env, jclass cls,
  *                          blocks.  Use if partition has disk errors
  */
 JNIEXPORT void JNICALL 
-Java_org_openafs_jafs_Server_salvage (JNIEnv *env, jclass cls, 
-                                        jint cellHandle, jint serverHandle, 
-                                        jstring jpartName, jstring jvolName, 
-                                        jint numSalvagers, jstring jtempDir, 
-                                        jstring jlogFile, 
-                                        jboolean inspectAllVolumes, 
-                                        jboolean removeBadlyDamaged, 
-                                        jboolean writeInodes, 
-                                        jboolean writeRootInodes, 
-                                        jboolean forceDirectory, 
-                                        jboolean forceBlockReads) {
-
+Java_org_openafs_jafs_Server_salvage 
+  (JNIEnv *env, jclass cls, 
+   jint cellHandle, 
+   jint serverHandle, 
+   jstring jpartName, 
+   jstring jvolName, 
+   jint numSalvagers, 
+   jstring jtempDir, 
+   jstring jlogFile, 
+   jboolean inspectAllVolumes, 
+   jboolean removeBadlyDamaged, 
+   jboolean writeInodes, 
+   jboolean writeRootInodes, 
+   jboolean forceDirectory, 
+   jboolean forceBlockReads)
+{
   afs_status_t ast;
-  const char *partName;
-  const char *volName;
-  const char *tempDir;
-  const char *logFile;
+  char *partName;
+  char *volName;
+  char *tempDir;
+  char *logFile;
   vos_force_t force;
   bos_SalvageDamagedVolumes_t sdv;
   bos_WriteInodes_t wi;
@@ -1020,54 +986,45 @@ Java_org_openafs_jafs_Server_salvage (JNIEnv *env, jclass cls,
   bos_ForceBlockRead_t forceBR;
   
   // convert strings
-  if( jpartName != NULL ) {
-    partName = (*env)->GetStringUTFChars(env, jpartName, 0);    
-    if( !partName ) {
+  if ( jpartName != NULL ) {
+    partName = getNativeString(env, jpartName);
+    if ( !partName ) {
        throwAFSException( env, JAFSADMNOMEM );
        return;    
     }
   } else {
     partName = NULL;
   }
-  if( jvolName != NULL ) {
-    volName = (*env)->GetStringUTFChars(env, jvolName, 0);    
-    if( !volName ) {
-      if( partName != NULL ) {
-       (*env)->ReleaseStringUTFChars(env, jpartName, partName);    
-      }
+
+  if ( jvolName != NULL ) {
+    volName = getNativeString(env, jvolName);
+    if ( !volName ) {
+      if ( partName != NULL ) free( partName );
       throwAFSException( env, JAFSADMNOMEM );
       return;    
     }
   } else {
     volName = NULL;
   }
-  if( jtempDir != NULL ) {
-    tempDir = (*env)->GetStringUTFChars(env, jtempDir, 0);    
-    if( !tempDir ) {
-      if( partName != NULL ) {
-       (*env)->ReleaseStringUTFChars(env, jpartName, partName);    
-      }
-      if( volName != NULL ) {
-       (*env)->ReleaseStringUTFChars(env, jvolName, volName);    
-      }
+
+  if ( jtempDir != NULL ) {
+    tempDir = getNativeString(env, jtempDir);
+    if ( !tempDir ) {
+      if ( partName != NULL ) free( partName );
+      if ( volName != NULL )  free( volName );
       throwAFSException( env, JAFSADMNOMEM );
       return;    
     }
   } else {
     tempDir = NULL;
   }
-  if( jlogFile != NULL ) {
-    logFile = (*env)->GetStringUTFChars(env, jlogFile, 0);    
-    if( !logFile ) {
-      if( partName != NULL ) {
-       (*env)->ReleaseStringUTFChars(env, jpartName, partName);    
-      }
-      if( volName != NULL ) {
-       (*env)->ReleaseStringUTFChars(env, jvolName, volName);    
-      }
-      if( tempDir != NULL ) {
-       (*env)->ReleaseStringUTFChars(env, jtempDir, tempDir);    
-      }
+
+  if ( jlogFile != NULL ) {
+    logFile = getNativeString(env, jlogFile);
+    if ( !logFile ) {
+      if ( partName != NULL ) free( partName );
+      if ( volName != NULL )  free( volName );
+      if ( tempDir != NULL )  free( tempDir );
       throwAFSException( env, JAFSADMNOMEM );
       return;    
     }
@@ -1076,70 +1033,49 @@ Java_org_openafs_jafs_Server_salvage (JNIEnv *env, jclass cls,
   }
 
   // deal with booleans
-  if( inspectAllVolumes ) {
+  if ( inspectAllVolumes ) {
     force = VOS_FORCE;
   } else {
     force = VOS_NORMAL;
   }
-  if( removeBadlyDamaged ) {
+  if ( removeBadlyDamaged ) {
     sdv = BOS_DONT_SALVAGE_DAMAGED_VOLUMES;
   } else {
     sdv = BOS_SALVAGE_DAMAGED_VOLUMES;
   }
-  if( writeInodes ) {
+  if ( writeInodes ) {
     wi = BOS_SALVAGE_WRITE_INODES;
   } else {
     wi = BOS_SALVAGE_DONT_WRITE_INODES;
   }
-  if( writeRootInodes ) {
+  if ( writeRootInodes ) {
     wri = BOS_SALVAGE_WRITE_ROOT_INODES;
   } else {
     wri = BOS_SALVAGE_DONT_WRITE_ROOT_INODES;
   }
-  if( forceDirectory ) {
+  if ( forceDirectory ) {
     forceD = BOS_SALVAGE_FORCE_DIRECTORIES;
   } else {
     forceD = BOS_SALVAGE_DONT_FORCE_DIRECTORIES;
   }
-  if( forceBlockReads ) {
+  if ( forceBlockReads ) {
     forceBR = BOS_SALVAGE_FORCE_BLOCK_READS;
   } else {
     forceBR = BOS_SALVAGE_DONT_FORCE_BLOCK_READS;
   }
 
   //salvage!
-  if( !bos_Salvage( (void *) cellHandle, (void *) serverHandle, partName, 
+  if ( !bos_Salvage( (void *) cellHandle, (void *) serverHandle, partName, 
                    volName, (int) numSalvagers, tempDir, logFile, force, sdv, 
                    wi, wri, forceD, forceBR, &ast ) ) {
-    if( partName != NULL ) {
-      (*env)->ReleaseStringUTFChars(env, jpartName, partName);    
-    }
-    if( volName != NULL ) {
-      (*env)->ReleaseStringUTFChars(env, jvolName, volName);    
-    }
-    if( tempDir != NULL ) {
-      (*env)->ReleaseStringUTFChars(env, jtempDir, tempDir);    
-    }
-    if( logFile != NULL ) {
-      (*env)->ReleaseStringUTFChars(env, jlogFile, logFile);    
-    }
     throwAFSException( env, ast );
-    return;
   }
 
   // release strings
-  if( partName != NULL ) {
-    (*env)->ReleaseStringUTFChars(env, jpartName, partName);    
-  }
-  if( volName != NULL ) {
-    (*env)->ReleaseStringUTFChars(env, jvolName, volName);    
-  }
-  if( tempDir != NULL ) {
-    (*env)->ReleaseStringUTFChars(env, jtempDir, tempDir);    
-  }
-  if( logFile != NULL ) {
-    (*env)->ReleaseStringUTFChars(env, jlogFile, logFile);    
-  }
+  if ( partName != NULL ) free( partName );
+  if ( volName != NULL )  free( volName );
+  if ( tempDir != NULL )  free( tempDir );
+  if ( logFile != NULL )  free( logFile );
 
 }
 
@@ -1172,11 +1108,11 @@ Java_org_openafs_jafs_Server_getRestartTime
   jfieldID nowField;
 
   // get the class fields if need be
-  if( exectimeCls == 0 ) {
+  if ( exectimeCls == 0 ) {
     internal_getExecTimeClass( env, exectime );
   }
 
-  if( jtype == org_openafs_jafs_Server_RESTART_BINARY ) {
+  if ( jtype == org_openafs_jafs_Server_RESTART_BINARY ) {
     type = BOS_RESTART_DAILY;
   } else {
     type = BOS_RESTART_WEEKLY;
@@ -1189,7 +1125,7 @@ Java_org_openafs_jafs_Server_getRestartTime
   neverField = exectime_NeverField;
   nowField   = exectime_NowField;
 
-  if( !bos_ExecutableRestartTimeGet( (void *) serverHandle, type, 
+  if ( !bos_ExecutableRestartTimeGet( (void *) serverHandle, type, 
                                     &time, &ast ) ) {
     throwAFSException( env, ast );
     return;
@@ -1213,7 +1149,7 @@ Java_org_openafs_jafs_Server_getRestartTime
   (*env)->SetShortField(env, exectime, secField, time.sec );
 
   // set day
-  if( time.mask & BOS_RESTART_TIME_DAY ) {
+  if ( time.mask & BOS_RESTART_TIME_DAY ) {
     (*env)->SetShortField(env, exectime, dayField, time.day );
   } else {
     (*env)->SetShortField(env, exectime, dayField, (jshort) -1 );
@@ -1235,10 +1171,9 @@ Java_org_openafs_jafs_Server_getRestartTime
  *                         desired information
  */
 JNIEXPORT void JNICALL 
-Java_org_openafs_jafs_Server_setRestartTime (JNIEnv *env, jclass cls, 
-                                               jint serverHandle, jint jtype, 
-                                               jobject exectime ) {
-
+Java_org_openafs_jafs_Server_setRestartTime 
+  (JNIEnv *env, jclass cls, jint serverHandle, jint jtype, jobject exectime )
+{
   afs_status_t ast;
   bos_Restart_t type;
   bos_RestartTime_t time;
@@ -1260,11 +1195,11 @@ Java_org_openafs_jafs_Server_setRestartTime (JNIEnv *env, jclass cls,
   jfieldID nowField;
 
   // get the class fields if need be
-  if( exectimeCls == 0 ) {
+  if ( exectimeCls == 0 ) {
     internal_getExecTimeClass( env, exectime );
   }
 
-  if( jtype == org_openafs_jafs_Server_RESTART_BINARY ) {
+  if ( jtype == org_openafs_jafs_Server_RESTART_BINARY ) {
     type = BOS_RESTART_DAILY;
   } else {
     type = BOS_RESTART_WEEKLY;
@@ -1278,25 +1213,25 @@ Java_org_openafs_jafs_Server_setRestartTime (JNIEnv *env, jclass cls,
   nowField   = exectime_NowField;
 
   hour = (*env)->GetShortField(env, exectime, hourField );
-  if( hour != 0 ) {
+  if ( hour != 0 ) {
     doHour = TRUE;
   } else {
     doHour = FALSE;
   }
   minute = (*env)->GetShortField(env, exectime, minField );
-  if( minute != 0 ) {
+  if ( minute != 0 ) {
     doMinute = TRUE;
   } else {
     doMinute = FALSE;
   }
   second = (*env)->GetShortField(env, exectime, secField );
-  if( second != 0 ) {
+  if ( second != 0 ) {
     doSecond = TRUE;
   } else {
     doSecond = FALSE;
   }
   day = (*env)->GetShortField(env, exectime, dayField );
-  if( day != -1 ) {
+  if ( day != -1 ) {
     doDay = TRUE;
   } else {
     doDay = FALSE;
@@ -1306,28 +1241,28 @@ Java_org_openafs_jafs_Server_setRestartTime (JNIEnv *env, jclass cls,
 
   bzero(&time, sizeof(time));
 
-  if( jtype == org_openafs_jafs_Server_RESTART_BINARY ) {
+  if ( jtype == org_openafs_jafs_Server_RESTART_BINARY ) {
     type = BOS_RESTART_DAILY;
   } else {
     type = BOS_RESTART_WEEKLY;
   }  
 
-  if( doHour ) {
+  if ( doHour ) {
     time.mask |= BOS_RESTART_TIME_HOUR;
   }
-  if( doMinute ) {
+  if ( doMinute ) {
     time.mask |= BOS_RESTART_TIME_MINUTE;
   }
-  if( doSecond ) {
+  if ( doSecond ) {
     time.mask |= BOS_RESTART_TIME_SECOND;
   }
-  if( doDay ) {
+  if ( doDay ) {
     time.mask |= BOS_RESTART_TIME_DAY;
   }
-  if( doNever ) {
+  if ( doNever ) {
     time.mask |= BOS_RESTART_TIME_NEVER;
   }
-  if( doNow ) {
+  if ( doNow ) {
     time.mask |= BOS_RESTART_TIME_NOW;
   }
 
@@ -1336,12 +1271,10 @@ Java_org_openafs_jafs_Server_setRestartTime (JNIEnv *env, jclass cls,
   time.sec = second;
   time.day = day;
 
-  if( !bos_ExecutableRestartTimeSet( (void *) serverHandle, type, 
+  if ( !bos_ExecutableRestartTimeSet( (void *) serverHandle, type, 
                                     time, &ast ) ) {
     throwAFSException( env, ast );
-    return;
   }
-
 }
 
 /**
@@ -1354,26 +1287,22 @@ Java_org_openafs_jafs_Server_setRestartTime (JNIEnv *env, jclass cls,
  * partition   the id of the partition to sync, can be -1 to ignore
  */
 JNIEXPORT void JNICALL 
-Java_org_openafs_jafs_Server_syncServerWithVLDB (JNIEnv *env, jclass cls, 
-                                                   jint cellHandle, 
-                                                   jint serverHandle, 
-                                                   jint partition) {
-
+Java_org_openafs_jafs_Server_syncServerWithVLDB 
+  (JNIEnv *env, jclass cls, jint cellHandle, jint serverHandle, jint partition)
+{
   afs_status_t ast;
   int *part;
 
-  if( partition == -1 ) {
+  if ( partition == -1 ) {
     part = NULL;
   } else {
     part = (int *) &partition;
   }
 
-  if( !vos_ServerSync( (void *) cellHandle, (void *) serverHandle, 
+  if ( !vos_ServerSync( (void *) cellHandle, (void *) serverHandle, 
                       NULL, part, &ast ) ) {
     throwAFSException( env, ast );
-    return;
   }
-
 }
 
 /**
@@ -1387,34 +1316,30 @@ Java_org_openafs_jafs_Server_syncServerWithVLDB (JNIEnv *env, jclass cls,
  * forceDeletion   whether or not to force the deletion of bad volumes
  */
 JNIEXPORT void JNICALL 
-Java_org_openafs_jafs_Server_syncVLDBWithServer (JNIEnv *env, jclass cls, 
-                                                   jint cellHandle, 
-                                                   jint serverHandle, 
-                                                   jint partition, 
-                                                   jboolean forceDeletion) {
-
+Java_org_openafs_jafs_Server_syncVLDBWithServer 
+  (JNIEnv *env, jclass cls, jint cellHandle, jint serverHandle, jint partition, 
+   jboolean forceDeletion)
+{
   afs_status_t ast;
   int *part;
   vos_force_t force;
 
-  if( partition == -1 ) {
+  if ( partition == -1 ) {
     part = NULL;
   } else {
     part = (int *) &partition;
   }
   
-  if( forceDeletion ) {
+  if ( forceDeletion ) {
     force = VOS_FORCE;
   } else {
     force = VOS_NORMAL;
   }
 
-  if( !vos_VLDBSync( (void *) cellHandle, (void *) serverHandle, NULL, part, 
+  if ( !vos_VLDBSync( (void *) cellHandle, (void *) serverHandle, NULL, part, 
                     force, &ast ) ) {
     throwAFSException( env, ast );
-    return;
   }
-
 }
 
 /**
@@ -1426,16 +1351,15 @@ Java_org_openafs_jafs_Server_syncVLDBWithServer (JNIEnv *env, jclass cls,
  *                      processes belong
  */
 JNIEXPORT void JNICALL 
-Java_org_openafs_jafs_Server_startAllProcesses (JNIEnv *env, jclass cls, 
-                                                  jint serverHandle) {
-
+Java_org_openafs_jafs_Server_startAllProcesses 
+  (JNIEnv *env, jclass cls, jint serverHandle)
+{
   afs_status_t ast;
 
-  if( !bos_ProcessAllStart( (void *) serverHandle, &ast ) ) {
+  if ( !bos_ProcessAllStart( (void *) serverHandle, &ast ) ) {
     throwAFSException( env, ast );
     return;
   }
-
 }
 
 /**
@@ -1447,16 +1371,15 @@ Java_org_openafs_jafs_Server_startAllProcesses (JNIEnv *env, jclass cls,
  *                      processes belong
  */
 JNIEXPORT void JNICALL 
-Java_org_openafs_jafs_Server_stopAllProcesses (JNIEnv *env, jclass cls, 
-                                                 jint serverHandle) {
-
+Java_org_openafs_jafs_Server_stopAllProcesses 
+  (JNIEnv *env, jclass cls, jint serverHandle)
+{
   afs_status_t ast;
 
-  if( !bos_ProcessAllStop( (void *) serverHandle, &ast ) ) {
+  if ( !bos_ProcessAllStop( (void *) serverHandle, &ast ) ) {
     throwAFSException( env, ast );
     return;
   }
-
 }
 
 /**
@@ -1469,24 +1392,22 @@ Java_org_openafs_jafs_Server_stopAllProcesses (JNIEnv *env, jclass cls,
  * restartBosServer   whether or not to restart the bos server as well
  */
 JNIEXPORT void JNICALL 
-Java_org_openafs_jafs_Server_restartAllProcesses (JNIEnv *env, jclass cls, 
-                                                    jint serverHandle, 
-                                                  jboolean restartBosServer) {
-
+Java_org_openafs_jafs_Server_restartAllProcesses 
+  (JNIEnv *env, jclass cls, jint serverHandle, jboolean restartBosServer)
+{
   afs_status_t ast;
   bos_RestartBosServer_t rbs;
   
-  if( restartBosServer ) {
+  if ( restartBosServer ) {
     rbs = BOS_RESTART_BOS_SERVER;
   } else {
     rbs = BOS_DONT_RESTART_BOS_SERVER;
   }
 
-  if( !bos_ProcessAllStopAndRestart( (void *) serverHandle, rbs, &ast ) ) {
+  if ( !bos_ProcessAllStopAndRestart( (void *) serverHandle, rbs, &ast ) ) {
     throwAFSException( env, ast );
     return;
   }
-
 }
 
 /**
@@ -1500,88 +1421,79 @@ Java_org_openafs_jafs_Server_restartAllProcesses (JNIEnv *env, jclass cls,
  * jlogFile   the full path and name of the desired bos log
  */
 JNIEXPORT jstring JNICALL 
-Java_org_openafs_jafs_Server_getLog(JNIEnv *env, jclass cls, 
-                                      jint serverHandle, jstring jlogFile) {
-
-    afs_status_t ast;
-    const char *logFile;
-    char *logData;
-    unsigned long currInLogSize = 1;
-    unsigned long currOutLogSize = 0;
-    jstring logOut;
-
-    if( jlogFile != NULL ) {
-      logFile = (*env)->GetStringUTFChars(env, jlogFile, 0);
-      if( !logFile ) {
-         throwAFSException( env, JAFSADMNOMEM );
-         return;    
-      }
-    } else {
-      logFile = NULL;
-    }
+Java_org_openafs_jafs_Server_getLog
+  (JNIEnv *env, jclass cls, jint serverHandle, jstring jlogFile)
+{
+  afs_status_t ast;
+  char *logFile;
+  char *logData;
+  unsigned long currInLogSize = 1;
+  unsigned long currOutLogSize = 0;
+  jstring logOut;
+
+  logData = (char *) malloc( sizeof(char)*currInLogSize );
+  if ( logData == NULL ) {
+    throwAFSException( env, JAFSADMNOMEM );
+    return NULL;
+  }
 
-    logData = (char *) malloc( sizeof(char)*currInLogSize );
-    if( !logData ) {
+  if ( jlogFile != NULL ) {
+    logFile = getNativeString(env, jlogFile);
+    if ( logFile == NULL ) {
+      free( logData );
       throwAFSException( env, JAFSADMNOMEM );
-      return;    
-    }
-
-    // check how big the log is . . .
-    if( !bos_LogGet( (void *) serverHandle, logFile, 
-                    &currOutLogSize, logData, &ast ) ) {
-      // anything but not enough room in buffer
-      if( ast != ADMMOREDATA ) {
-       free( logData );
-       if( logFile != NULL ) { 
-         (*env)->ReleaseStringUTFChars(env, jlogFile, logFile);
-       }
-       throwAFSException( env, ast );
-       return NULL;
-      }
+      return NULL;
     }
-
+  } else {
     free( logData );
+    throwAFSException( env, JAFSNULLARG );
+    return NULL;
+  }
 
-    // increase log size (plus one for terminator)
-    currInLogSize = currOutLogSize + 1;
-    // allocate buffer
-    logData = (char *) malloc( sizeof(char)*currInLogSize );
-    if( !logData ) {
-      throwAFSException( env, JAFSADMNOMEM );
-      return;    
-    }
-
-    if( !logData ) {
-      // memory exception
-      if( logFile != NULL ) { 
-         (*env)->ReleaseStringUTFChars(env, jlogFile, logFile);
-      }
+  // check how big the log is . . .
+  if ( !bos_LogGet( (void *) serverHandle, logFile, 
+                    &currOutLogSize, logData, &ast ) ) {
+    // anything but not enough room in buffer
+    if ( ast != ADMMOREDATA ) {
+      free( logData );
+      free( logFile );
       throwAFSException( env, ast );
       return NULL;
     }
+  }
 
-    // get the log for real
-    if( !bos_LogGet( (void *) serverHandle, logFile, &currOutLogSize, 
-                    logData, &ast ) ) {
-       free( logData );
-       if( logFile != NULL ) { 
-         (*env)->ReleaseStringUTFChars(env, jlogFile, logFile);
-       }
-       (*env)->ReleaseStringUTFChars(env, jlogFile, logFile);
-       throwAFSException( env, ast );
-       return NULL;
-    }
+  // free previous allocation
+  free( logData );
+
+  // increase log size (plus one for terminator)
+  currInLogSize = currOutLogSize + 1;
+
+  // allocate buffer
+  logData = (char *) malloc( sizeof(char)*currInLogSize );
+  if ( logData == NULL ) {
+    free( logFile );
+    throwAFSException( env, JAFSADMNOMEM );
+    return NULL;
+  }
+
+  // get the log for real
+  if ( !bos_LogGet( (void *) serverHandle, logFile, &currOutLogSize, 
+                    logData, &ast ) ) {
+    free( logData );
+    free( logFile );
+    throwAFSException( env, ast );
+    return NULL;
+  }
     
-    logData[currOutLogSize] == '\0';
+  // NULL-terminate
+  logData[currOutLogSize] == '\0';
 
-    logOut = (*env)->NewStringUTF(env, logData);
+  logOut = (*env)->NewStringUTF(env, logData);
     
-    free( logData );
-    if( logFile != NULL ) { 
-      (*env)->ReleaseStringUTFChars(env, jlogFile, logFile);
-    }
-    return logOut;
+  free( logData );
+  free( logFile );
 
+  return logOut;
 }
 
 
@@ -1594,64 +1506,37 @@ Java_org_openafs_jafs_Server_getLog(JNIEnv *env, jclass cls,
  * jcommand     the text of the commmand to execute
  */
 JNIEXPORT void JNICALL 
-Java_org_openafs_jafs_Server_executeCommand (JNIEnv *env, jclass cls, 
-                                               jint serverHandle, 
-                                               jstring jcommand) {
-
+Java_org_openafs_jafs_Server_executeCommand 
+  (JNIEnv *env, jclass cls, jint serverHandle, jstring jcommand)
+{
   afs_status_t ast;
-  const char *command;
+  char *command;
 
-  if( jcommand != NULL ) {
-    command = (*env)->GetStringUTFChars(env, jcommand, 0);
-    if( !command ) {
+  if ( jcommand != NULL ) {
+    command = getNativeString(env, jcommand);
+    if ( command == NULL ) {
        throwAFSException( env, JAFSADMNOMEM );
        return;    
     }
   } else {
-    command = NULL;
-  }
-
-  if( !bos_CommandExecute( (void *) serverHandle, command, &ast ) ) {
-    if( command != NULL ) {
-      (*env)->ReleaseStringUTFChars(env, jcommand, command);
-    }
-    throwAFSException( env, ast );
+    throwAFSException( env, JAFSNULLARG );
     return;
   }
 
-  if( command != NULL ) {
-    (*env)->ReleaseStringUTFChars(env, jcommand, command);
+  if ( !bos_CommandExecute( (void *) serverHandle, command, &ast ) ) {
+    throwAFSException( env, ast );
   }
 
+  free( command );
 }
 
 // reclaim global memory being used by this portion
 JNIEXPORT void JNICALL
-Java_org_openafs_jafs_Server_reclaimServerMemory (JNIEnv *env, jclass cls) {
-
-  if( serverCls ) {
-      (*env)->DeleteGlobalRef(env, serverCls);
-      serverCls = 0;
+Java_org_openafs_jafs_Server_reclaimServerMemory 
+  (JNIEnv *env, jclass cls)
+{
+  if ( serverCls ) {
+    (*env)->DeleteGlobalRef(env, serverCls);
+    serverCls = 0;
   }
-
 }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
index cf57acbd26b8557afde53e9f9e9a5028fa14c57c..7a32bb65fb4205e4b072da0a83565b4ba5d1ecf3 100644 (file)
@@ -68,7 +68,6 @@ extern jfieldID user_lockTimeField;
 extern jfieldID user_lockedUntilField;
 
 extern jclass groupCls;
-//extern jfieldID group_cellHandleField;
 extern jfieldID group_nameField;
 extern jfieldID group_cachedInfoField;
 
@@ -81,140 +80,113 @@ extern jfieldID group_cachedInfoField;
  * env      the Java environment
  * cls      the current Java class
  * cellHandle    the handle of the cell to which the user belongs
- * juserName      the name of the user to create
+ * jusername      the name of the user to create
  * jpassword      the password for the new user
  * uid     the user id to assign to the user (0 to have one 
  *                automatically assigned)
  */
 JNIEXPORT void JNICALL 
 Java_org_openafs_jafs_User_create
-  (JNIEnv *env, jclass cls, jint cellHandle, jstring juserName, 
+  (JNIEnv *env, jclass cls, jint cellHandle, jstring jusername, 
    jstring jpassword, jint uid )
 {
   afs_status_t ast;
-  const char *userName;
-  const char *password;
+  char *username;
+  char *password;
   kas_identity_p who = (kas_identity_p) malloc( sizeof(kas_identity_t) );
   
-  if( !who ) {
+  if ( !who ) {
     throwAFSException( env, JAFSADMNOMEM );
     return;    
   }
 
   // convert java strings
-  if( juserName != NULL ) {
-    userName = (*env)->GetStringUTFChars(env, juserName, 0);
-    if( !userName ) {
+  if ( jusername != NULL ) {
+    username = getNativeString(env, jusername);
+    if ( username == NULL ) {
       free( who );
       throwAFSException( env, JAFSADMNOMEM );
       return;    
     }
   } else {
-    userName = NULL;
+    free( who );
+    throwAFSException( env, JAFSNULLUSER );
+    return;
   }
-  if( jpassword != NULL ) {
-    password = (*env)->GetStringUTFChars(env, jpassword, 0);
-    if( !password ) {
+
+  if ( jpassword != NULL ) {
+    password = getNativeString(env, jpassword);
+    if ( password == NULL ) {
       free( who );
-      if( userName != NULL ) {
-       (*env)->ReleaseStringUTFChars(env, juserName, userName);
-      }
+      free( username );
       throwAFSException( env, JAFSADMNOMEM );
       return;    
     }
   } else {
-    password = NULL;
+    free( who );
+    free( username );
+    throwAFSException( env, JAFSNULLPASS );
+    return;
   }
 
   // make sure the name is within the allowed bounds
-  if( userName != NULL && strlen( userName ) > KAS_MAX_NAME_LEN ) {
+  if ( strlen( username ) > KAS_MAX_NAME_LEN ) {
     free( who );
-    // release converted java strings
-    if( userName != NULL ) {
-      (*env)->ReleaseStringUTFChars(env, juserName, userName);
-    }
-    if( password != NULL ) {
-      (*env)->ReleaseStringUTFChars(env, jpassword, password);
-    }
+    free( username );
+    free( password );
     throwAFSException( env, ADMPTSUSERNAMETOOLONG  );
     return;
   }
 
   // make sure name doesn't have ":" in it
-  if( userName != NULL && strchr( userName, ':' ) != (int) NULL ) {
-      free(who);
-      // release converted java strings
-      if( userName != NULL ) {
-       (*env)->ReleaseStringUTFChars(env, juserName, userName);
-      }
-      if( password != NULL ) {
-       (*env)->ReleaseStringUTFChars(env, jpassword, password);
-      }
-      throwAFSException( env, PRBADNAM );
-      return;
+  if ( strchr( username, ':' ) != (int) NULL ) {
+    free( who );
+    free( username );
+    free( password );
+    throwAFSException( env, PRBADNAM );
+    return;
   }
 
   // make sure the id isn't negative
-  if( uid < 0 ) {
-      free(who);
-      // release converted java strings
-      if( userName != NULL ) {
-       (*env)->ReleaseStringUTFChars(env, juserName, userName);
-      }
-      if( password != NULL ) {
-       (*env)->ReleaseStringUTFChars(env, jpassword, password);
-      }
-      // use the "bad arg" error code even though it's an ID exception.  
-      // There isn't a bad user ID error code
-      throwAFSException( env, PRBADARG );
-      return;
+  if ( uid < 0 ) {
+    free( who );
+    free( username );
+    free( password );
+    // use the "bad arg" error code even though it's an ID exception.  
+    // There isn't a bad user ID error code
+    throwAFSException( env, PRBADARG );
+    return;
   }
 
-  if( userName != NULL ) {
-    internal_makeKasIdentity( userName, who );
+  if ( username != NULL ) {
+    internal_makeKasIdentity( username, who );
   }
 
   // create the kas entry
   if (!kas_PrincipalCreate( (void *) cellHandle, NULL, who, 
                            password, &ast ) ) {
-    free(who);
-    // release converted java strings
-    if( userName != NULL ) {
-      (*env)->ReleaseStringUTFChars(env, juserName, userName);
-    }
-    if( password != NULL ) {
-      (*env)->ReleaseStringUTFChars(env, jpassword, password);
-    }
+    free( who );
+    free( username );
+    free( password );
     throwAFSException( env, ast );
     return;
   } 
 
   // create the pts entry - if there's an error, make sure to delete 
   // the kas entry 
-  if( !pts_UserCreate( (void *) cellHandle, userName, (int *) &uid, &ast ) ) {
+  if ( !pts_UserCreate( (void *) cellHandle, username, (int *) &uid, &ast ) ) {
     afs_status_t ast_kd;
     kas_PrincipalDelete( (void *) cellHandle, NULL, who, &ast_kd );
     free( who );
-    // release converted java strings
-    if( userName != NULL ) {
-      (*env)->ReleaseStringUTFChars(env, juserName, userName);
-    }
-    if( password != NULL ) {
-      (*env)->ReleaseStringUTFChars(env, jpassword, password);
-    }
+    free( username );
+    free( password );
     throwAFSException( env, ast );
     return;
   }
 
   free( who );
-  // release converted java strings
-  if( userName != NULL ) {
-    (*env)->ReleaseStringUTFChars(env, juserName, userName);
-  }
-  if( password != NULL ) {
-    (*env)->ReleaseStringUTFChars(env, jpassword, password);
-  }
-
+  free( username );
+  free( password );
 }
 
 /**
@@ -225,81 +197,72 @@ Java_org_openafs_jafs_User_create
  * env      the Java environment
  * cls      the current Java class
  * cellHandle    the handle of the cell to which the user belongs
- * juserName      the name of the user to delete
+ * jusername      the name of the user to delete
  */
 JNIEXPORT void JNICALL 
 Java_org_openafs_jafs_User_delete
-  (JNIEnv *env, jclass cls, jint cellHandle, jstring juserName )
+  (JNIEnv *env, jclass cls, jint cellHandle, jstring jusername )
 {
   afs_status_t ast;
-  const char *userName;
+  char *username;
   kas_identity_p who = (kas_identity_p) malloc( sizeof(kas_identity_t) );  
   int kas;
   
-  if( !who ) {
+  if ( !who ) {
     throwAFSException( env, JAFSADMNOMEM );
     return;    
   }
 
-  if( juserName != NULL ) {
-      userName = (*env)->GetStringUTFChars(env, juserName, 0);
-      if( !userName ) {
+  if ( jusername != NULL ) {
+    username = getNativeString(env, jusername);
+    if ( username == NULL ) {
        free( who );
        throwAFSException( env, JAFSADMNOMEM );
        return;    
-      }
+    }
   } else {
-      userName = NULL;
+    free( who );
+    throwAFSException( env, JAFSNULLUSER );
+    return;
   }
 
   // make sure the name is within the allowed bounds
-  if( userName != NULL && strlen( userName ) > KAS_MAX_NAME_LEN ) {
+  if ( strlen( username ) > KAS_MAX_NAME_LEN ) {
     free( who );
-    if( userName != NULL ) {
-       (*env)->ReleaseStringUTFChars(env, juserName, userName);
-    }
+    free( username );
     throwAFSException( env, ADMPTSUSERNAMETOOLONG  );
     return;
   }
 
-  if( userName != NULL ) {
-      internal_makeKasIdentity( userName, who );
-  }
+  internal_makeKasIdentity( username, who );
 
   // delete the kas entry
-  if( !kas_PrincipalDelete( (void *) cellHandle, NULL, who, &ast ) ) {
-      if( ast != KANOENT ) {
-         free(who);
-         if( userName != NULL ) {
-             (*env)->ReleaseStringUTFChars(env, juserName, userName);
-         }
-         throwAFSException( env, ast );
-         return;
-      } else {
-         kas = FALSE;
-      }
+  if ( !kas_PrincipalDelete( (void *) cellHandle, NULL, who, &ast ) ) {
+    if ( ast != KANOENT ) {
+      free(who);
+      free( username );
+      throwAFSException( env, ast );
+      return;
+    } else {
+      kas = FALSE;
+    }
   }
 
   //delete the pts entry
-  if( !pts_UserDelete( (void *) cellHandle, userName, &ast ) ) {
-      // throw exception if there was no such pts user only if there was 
-      // also no such kas user
-      if( (ast == ADMPTSFAILEDNAMETRANSLATE && !kas ) || 
-         ast != ADMPTSFAILEDNAMETRANSLATE ) {
-         free( who );
-         if( userName != NULL ) {
-             (*env)->ReleaseStringUTFChars(env, juserName, userName);
-         }
-         throwAFSException( env, ast );
-         return;
-      }
+  if ( !pts_UserDelete( (void *) cellHandle, username, &ast ) ) {
+    // throw exception if there was no such pts user only if there was 
+    // also no such kas user
+    if ( (ast == ADMPTSFAILEDNAMETRANSLATE && !kas ) || 
+          ast != ADMPTSFAILEDNAMETRANSLATE ) {
+      free( who );
+      free( username );
+      throwAFSException( env, ast );
+      return;
+    }
   }
 
   free( who );
-  // release converted java strings
-  if( userName != NULL ) {
-      (*env)->ReleaseStringUTFChars(env, juserName, userName);
-  }
+  free( username );
 }
 
 /**
@@ -308,60 +271,54 @@ Java_org_openafs_jafs_User_delete
  * env      the Java environment
  * cls      the current Java class
  * cellHandle    the handle of the cell to which the user belongs
- * juserName      the name of the user to unlock
+ * jusername      the name of the user to unlock
  */
 JNIEXPORT void JNICALL 
 Java_org_openafs_jafs_User_unlock
-  (JNIEnv *env, jclass cls, jint cellHandle, jstring juserName )
+  (JNIEnv *env, jclass cls, jint cellHandle, jstring jusername )
 {
   afs_status_t ast;
-  const char *userName;
+  char *username;
   kas_identity_p who = (kas_identity_p) malloc( sizeof(kas_identity_t) );  
   
-  if( !who ) {
+  if ( !who ) {
     throwAFSException( env, JAFSADMNOMEM );
     return;    
   }
 
   // convert java strings
-  if( juserName != NULL ) {
-      userName = (*env)->GetStringUTFChars(env, juserName, 0);
-    if( !userName ) {
-       throwAFSException( env, JAFSADMNOMEM );
+  if ( jusername != NULL ) {
+    username = getNativeString(env, jusername);
+    if ( username == NULL ) {
+      free( who );
+       throwAFSException( env, JAFSADMNOMEM );
        return;    
     }
   } else {
-      userName = NULL;
+    free( who );
+    throwAFSException( env, JAFSNULLUSER );
+    return;
   }
 
   // make sure the name is within the allowed bounds
-  if( userName != NULL && strlen( userName ) > KAS_MAX_NAME_LEN ) {
+  if ( strlen( username ) > KAS_MAX_NAME_LEN ) {
     free( who );
-    if( userName != NULL ) {
-       (*env)->ReleaseStringUTFChars(env, juserName, userName);
-    }
+    free( username );
     throwAFSException( env, ADMPTSUSERNAMETOOLONG  );
     return;
   }  
 
-  if( userName != NULL ) {
-    internal_makeKasIdentity( userName, who );
-  }
+  internal_makeKasIdentity( username, who );
 
-  if( !kas_PrincipalUnlock( (void *) cellHandle, NULL, who, &ast ) ) {
+  if ( !kas_PrincipalUnlock( (void *) cellHandle, NULL, who, &ast ) ) {
     free( who );
-    if( userName != NULL ) {
-       (*env)->ReleaseStringUTFChars(env, juserName, userName);
-    }
+    free( username );
     throwAFSException( env, ast );
     return;
   }
 
   free( who );
-  // release converted java strings
-  if( userName != NULL ) {
-      (*env)->ReleaseStringUTFChars(env, juserName, userName);
-  }
+  free( username );
 }
 
 /**
@@ -388,65 +345,65 @@ void getUserInfoChar
   kas_principalEntry_t kasEntry;
   unsigned int lockedUntil;
 
-  if( !who ) {
+  if ( !who ) {
     throwAFSException( env, JAFSADMNOMEM );
     return;    
   }
 
   // make sure the name is within the allowed bounds
-  if( name != NULL && strlen( name ) > KAS_MAX_NAME_LEN ) {
+  if ( name != NULL && strlen( name ) > KAS_MAX_NAME_LEN ) {
     free( who );
     throwAFSException( env, ADMPTSUSERNAMETOOLONG );
     return;
   }
   
-  if( name != NULL ) {
-      internal_makeKasIdentity( name, who );
+  if ( name != NULL ) {
+    internal_makeKasIdentity( name, who );
   }
 
   // get all the field ids, if you haven't done so already
-  if( userCls == 0 ) {
+  if ( userCls == 0 ) {
     internal_getUserClass( env, user );
   }
 
   // get the pts entry
   if ( !pts_UserGet( (void *) cellHandle, name, &ptsEntry, &ast ) ) {
     // if the user has no pts ptsEntry
-    if( ast == ADMPTSFAILEDNAMETRANSLATE ) {
+    if ( ast == ADMPTSFAILEDNAMETRANSLATE ) {
        pts = FALSE;    
     } else {
-       free( who );
+      free( who );
        throwAFSException( env, ast );
        return;
     }
   } else {
-      pts = TRUE;
+    pts = TRUE;
   }
   
 
   // get the kas entry
-  if( !kas_PrincipalGet( (void *) cellHandle, NULL, who, &kasEntry, &ast ) ) {
+  if ( !kas_PrincipalGet( (void *) cellHandle, NULL, who, &kasEntry, &ast ) ) {
     // no kas entry
-    if( ast == KANOENT ) { 
-       if( !pts ) {
-           free( who );
-           throwAFSException( env, ast );
-           return;
+    if ( ast == KANOENT ) { 
+       if ( !pts ) {
+        free( who );
+        throwAFSException( env, ast );
+        return;
        } else {
-           kas = FALSE;
+        kas = FALSE;
        }
-    // other
+      // other
     } else {
        free( who );
        throwAFSException( env, ast );
        return;
     }
   } else {
-      kas = TRUE;
+    kas = TRUE;
   }
 
   // get the lock status
-  if( kas && !kas_PrincipalLockStatusGet( (void *) cellHandle, NULL, who, 
+  if ( kas && !kas_PrincipalLockStatusGet( (void *) cellHandle, NULL, who, 
                                          &lockedUntil, &ast ) ) {
     free( who );
     throwAFSException( env, ast );
@@ -457,7 +414,7 @@ void getUserInfoChar
   (*env)->SetBooleanField(env, user, user_kasField, kas);
 
   // set the pts fields
-  if( pts ) {
+  if ( pts ) {
       (*env)->SetIntField(env, user, user_nameUidField, ptsEntry.nameUid);
       (*env)->SetIntField(env, user, user_ownerUidField, ptsEntry.ownerUid);
       (*env)->SetIntField(env, user, user_creatorUidField, 
@@ -467,21 +424,21 @@ void getUserInfoChar
       (*env)->SetIntField(env, user, user_groupMembershipCountField, 
                          ptsEntry.groupMembershipCount);
       
-      if( ptsEntry.listStatus == PTS_USER_OWNER_ACCESS ) {
+      if ( ptsEntry.listStatus == PTS_USER_OWNER_ACCESS ) {
          (*env)->SetIntField(env, user, user_listStatusField, 
                              org_openafs_jafs_User_USER_OWNER_ACCESS);
       } else {
          (*env)->SetIntField(env, user, user_listStatusField, 
                              org_openafs_jafs_User_USER_ANYUSER_ACCESS);
       }
-      if( ptsEntry.listGroupsOwned == PTS_USER_OWNER_ACCESS ) {
+      if ( ptsEntry.listGroupsOwned == PTS_USER_OWNER_ACCESS ) {
          (*env)->SetIntField(env, user, user_listGroupsOwnedField, 
                              org_openafs_jafs_User_USER_OWNER_ACCESS);
       } else {
          (*env)->SetIntField(env, user, user_listGroupsOwnedField, 
                              org_openafs_jafs_User_USER_ANYUSER_ACCESS);
       }
-      if( ptsEntry.listMembership == PTS_USER_OWNER_ACCESS ) {
+      if ( ptsEntry.listMembership == PTS_USER_OWNER_ACCESS ) {
          (*env)->SetIntField(env, user, user_listMembershipField, 
                              org_openafs_jafs_User_USER_OWNER_ACCESS);
       } else {
@@ -498,38 +455,38 @@ void getUserInfoChar
   }
 
   // set the kas fields
-  if( kas ) {
+  if ( kas ) {
       char *convertedKey;
       int i;
-      if( kasEntry.adminSetting == KAS_ADMIN ) {
+      if ( kasEntry.adminSetting == KAS_ADMIN ) {
          (*env)->SetIntField(env, user, user_adminSettingField, 
                              org_openafs_jafs_User_ADMIN);
       } else {
          (*env)->SetIntField(env, user, user_adminSettingField, 
                              org_openafs_jafs_User_NO_ADMIN);
       }
-      if( kasEntry.tgsSetting == TGS ) {
+      if ( kasEntry.tgsSetting == TGS ) {
          (*env)->SetIntField(env, user, user_tgsSettingField, 
                              org_openafs_jafs_User_GRANT_TICKETS);
       } else {
          (*env)->SetIntField(env, user, user_tgsSettingField, 
                              org_openafs_jafs_User_NO_GRANT_TICKETS);
       }
-      if( kasEntry.encSetting != NO_ENCRYPT ) {
+      if ( kasEntry.encSetting != NO_ENCRYPT ) {
          (*env)->SetIntField(env, user, user_encSettingField, 
                              org_openafs_jafs_User_ENCRYPT);
       } else {
          (*env)->SetIntField(env, user, user_encSettingField, 
                              org_openafs_jafs_User_NO_ENCRYPT);
       }
-      if( kasEntry.cpwSetting == CHANGE_PASSWORD ) {
+      if ( kasEntry.cpwSetting == CHANGE_PASSWORD ) {
          (*env)->SetIntField(env, user, user_cpwSettingField, 
                              org_openafs_jafs_User_CHANGE_PASSWORD);
       } else {
          (*env)->SetIntField(env, user, user_cpwSettingField, 
                              org_openafs_jafs_User_NO_CHANGE_PASSWORD);
       }
-      if( kasEntry.rpwSetting == REUSE_PASSWORD ) {
+      if ( kasEntry.rpwSetting == REUSE_PASSWORD ) {
          (*env)->SetIntField(env, user, user_rpwSettingField, 
                              org_openafs_jafs_User_REUSE_PASSWORD);
       } else {
@@ -561,19 +518,20 @@ void getUserInfoChar
 
       convertedKey = (char *) malloc( sizeof(char *)*
                                      (sizeof(kasEntry.key.key)*4+1) );
-      if( !convertedKey ) {
-       throwAFSException( env, JAFSADMNOMEM );
-       return;    
+      if ( !convertedKey ) {
+        free( who );
+        throwAFSException( env, JAFSADMNOMEM );
+        return;    
       }
       for( i = 0; i < sizeof(kasEntry.key.key); i++ ) {
-       sprintf( &(convertedKey[i*4]), "\\%0.3o", kasEntry.key.key[i] );
+        sprintf( &(convertedKey[i*4]), "\\%0.3o", kasEntry.key.key[i] );
       }
       jencryptionKey =  (*env)->NewStringUTF(env, convertedKey);
       (*env)->SetObjectField(env, user, user_encryptionKeyField, 
-                            jencryptionKey);
+                             jencryptionKey);
       free( convertedKey );
   }
-  free(who);
+  free( who );
 }
 
 /**
@@ -591,31 +549,30 @@ JNIEXPORT void JNICALL
 Java_org_openafs_jafs_User_getUserInfo
   (JNIEnv *env, jclass cls, jint cellHandle, jstring jname, jobject user)
 {
-  const char *name;
+  char *name;
 
-  if( jname != NULL ) {
-      name = (*env)->GetStringUTFChars(env, jname, 0);
-    if( !name ) {
+  if ( jname != NULL ) {
+    name = getNativeString(env, jname);
+    if ( !name ) {
        throwAFSException( env, JAFSADMNOMEM );
        return;    
     }
   } else {
-      name = NULL;
+    throwAFSException( env, JAFSNULLUSER );
+    return;  
   }
 
   getUserInfoChar( env, cellHandle, name, user );
  
   // get class fields if need be
-  if( userCls == 0 ) {
+  if ( userCls == 0 ) {
     internal_getUserClass( env, user );
   }
   
   // set name in case blank object
   (*env)->SetObjectField(env, user, user_nameField, jname);
   
-  if( name != NULL ) {
-      (*env)->ReleaseStringUTFChars(env, jname, name);
-  }      
+  free( name );
 }
 
 /**
@@ -633,7 +590,7 @@ JNIEXPORT void JNICALL
 Java_org_openafs_jafs_User_setUserInfo
   (JNIEnv *env, jclass cls, jint cellHandle, jstring jname, jobject user )
 {
-  const char *name;
+  char *name;
   kas_identity_p who = (kas_identity_p) malloc( sizeof(kas_identity_t) );
   pts_UserUpdateEntry_t ptsEntry;
   afs_status_t ast;
@@ -650,137 +607,130 @@ Java_org_openafs_jafs_User_setUserInfo
   int kas;
   int pts;
 
-  if( !who ) {
+  if ( !who ) {
     throwAFSException( env, JAFSADMNOMEM );
     return;    
   }
 
-  if( jname != NULL ) {
-      name = (*env)->GetStringUTFChars(env, jname, 0);
-    if( !name ) {
+  if ( jname != NULL ) {
+    name = getNativeString(env, jname);
+    if ( name == NULL ) {
+      free( who );
        throwAFSException( env, JAFSADMNOMEM );
        return;    
     }
   } else {
-      name = NULL;
+    free( who );
+    throwAFSException( env, JAFSNULLUSER );
+    return;  
   }
 
   // make sure the name is within the allowed bounds
-  if( name != NULL && strlen( name ) > KAS_MAX_NAME_LEN ) {
+  if ( strlen( name ) > KAS_MAX_NAME_LEN ) {
     free( who );
-    (*env)->ReleaseStringUTFChars(env, jname, name);
+    free( name );
     throwAFSException( env, ADMPTSUSERNAMETOOLONG );
     return;
   }
 
-  if( name != NULL ) {
-      internal_makeKasIdentity( name, who );
-  }
+  internal_makeKasIdentity( name, who );
 
   // get class fields if need be
-  if( userCls == 0 ) {
+  if ( userCls == 0 ) {
     internal_getUserClass( env, user );
   }
 
   kas = (*env)->GetBooleanField(env, user, user_kasField);
   pts = (*env)->GetBooleanField(env, user, user_ptsField);
 
-  if( pts ) {
-      // set the pts fields: 
-      ptsEntry.flag = PTS_USER_UPDATE_GROUP_CREATE_QUOTA | 
+  if ( pts ) {
+    // set the pts fields: 
+    ptsEntry.flag = PTS_USER_UPDATE_GROUP_CREATE_QUOTA | 
        PTS_USER_UPDATE_PERMISSIONS;
-      ptsEntry.groupCreationQuota = 
+    ptsEntry.groupCreationQuota = 
        (*env)->GetIntField(env, user, user_groupCreationQuotaField);
-      if( (*env)->GetIntField(env, user, user_listStatusField) == 
+    if ( (*env)->GetIntField(env, user, user_listStatusField) == 
          org_openafs_jafs_User_USER_OWNER_ACCESS ) {
-         ptsEntry.listStatus = PTS_USER_OWNER_ACCESS;
-      } else {
-         ptsEntry.listStatus = PTS_USER_ANYUSER_ACCESS;
-      }
-      if( (*env)->GetIntField(env, user, user_listGroupsOwnedField) == 
+      ptsEntry.listStatus = PTS_USER_OWNER_ACCESS;
+    } else {
+      ptsEntry.listStatus = PTS_USER_ANYUSER_ACCESS;
+    }
+    if ( (*env)->GetIntField(env, user, user_listGroupsOwnedField) == 
          org_openafs_jafs_User_USER_OWNER_ACCESS ) {
-         ptsEntry.listGroupsOwned = PTS_USER_OWNER_ACCESS;
-      } else {
-         ptsEntry.listGroupsOwned = PTS_USER_ANYUSER_ACCESS;
-      }
-      if( (*env)->GetIntField(env, user, user_listMembershipField) == 
+      ptsEntry.listGroupsOwned = PTS_USER_OWNER_ACCESS;
+    } else {
+      ptsEntry.listGroupsOwned = PTS_USER_ANYUSER_ACCESS;
+    }
+    if ( (*env)->GetIntField(env, user, user_listMembershipField) == 
          org_openafs_jafs_User_USER_OWNER_ACCESS ) {
-         ptsEntry.listMembership = PTS_USER_OWNER_ACCESS;
-      } else {
-         ptsEntry.listMembership = PTS_USER_ANYUSER_ACCESS;
-      }
-      if( !pts_UserModify( (void *) cellHandle, name, &ptsEntry, &ast ) ) {
-         free( who );
-         if( name != NULL ) {
-             (*env)->ReleaseStringUTFChars(env, jname, name);
-         }
-         throwAFSException( env, ast );
-         return;    
-      }
+      ptsEntry.listMembership = PTS_USER_OWNER_ACCESS;
+    } else {
+      ptsEntry.listMembership = PTS_USER_ANYUSER_ACCESS;
+    }
+    if ( !pts_UserModify( (void *) cellHandle, name, &ptsEntry, &ast ) ) {
+      free( who );
+      free( name );
+      throwAFSException( env, ast );
+      return;    
+    }
   }
 
-  if( kas ) {
-      // set the kas fields:
-      if( (*env)->GetIntField(env, user, user_adminSettingField) == 
+  if ( kas ) {
+    // set the kas fields:
+    if ( (*env)->GetIntField(env, user, user_adminSettingField) == 
          org_openafs_jafs_User_ADMIN ) {
-         isAdmin = KAS_ADMIN;
-      } else {
-         isAdmin = NO_KAS_ADMIN;
-      }
-      if( (*env)->GetIntField(env, user, user_tgsSettingField) == 
+      isAdmin = KAS_ADMIN;
+    } else {
+      isAdmin = NO_KAS_ADMIN;
+    }
+    if ( (*env)->GetIntField(env, user, user_tgsSettingField) == 
          org_openafs_jafs_User_GRANT_TICKETS ) {
-         grantTickets = TGS;
-      } else {
-         grantTickets = NO_TGS;
-      }
-      if( (*env)->GetIntField(env, user, user_encSettingField) == 
+      grantTickets = TGS;
+    } else {
+      grantTickets = NO_TGS;
+    }
+    if ( (*env)->GetIntField(env, user, user_encSettingField) == 
          org_openafs_jafs_User_ENCRYPT ) {
-         canEncrypt = 0;
-      } else {
-         canEncrypt = NO_ENCRYPT;
-      }
-      if( (*env)->GetIntField(env, user, user_cpwSettingField) == 
+      canEncrypt = 0;
+    } else {
+      canEncrypt = NO_ENCRYPT;
+    }
+    if ( (*env)->GetIntField(env, user, user_cpwSettingField) == 
          org_openafs_jafs_User_CHANGE_PASSWORD ) {
-         canChangePassword = CHANGE_PASSWORD;
-      } else {
-         canChangePassword = NO_CHANGE_PASSWORD;
-      }
-      if( (*env)->GetIntField(env, user, user_rpwSettingField) == 
+      canChangePassword = CHANGE_PASSWORD;
+    } else {
+      canChangePassword = NO_CHANGE_PASSWORD;
+    }
+    if ( (*env)->GetIntField(env, user, user_rpwSettingField) == 
          org_openafs_jafs_User_REUSE_PASSWORD ) {
-         passwordReuse = REUSE_PASSWORD;
-      } else {
-         passwordReuse = NO_REUSE_PASSWORD;
-      }
-      expirationDate = (*env)->GetIntField(env, user, 
-                                          user_userExpirationField);
-      maxTicketLifetime = (*env)->GetIntField(env, user, 
-                                             user_maxTicketLifetimeField);
-      passwordExpires = (*env)->GetIntField(env, user, 
-                                           user_daysToPasswordExpireField);
-      failedPasswordAttempts = (*env)->GetIntField(env, user, 
-                                                  user_failLoginCountField);
-      failedPasswordLockTime =  (*env)->GetIntField(env, user, 
-                                                   user_lockTimeField);
+      passwordReuse = REUSE_PASSWORD;
+    } else {
+      passwordReuse = NO_REUSE_PASSWORD;
+    }
+    expirationDate = (*env)->GetIntField(env, user, 
+                                         user_userExpirationField);
+    maxTicketLifetime = (*env)->GetIntField(env, user, 
+                                            user_maxTicketLifetimeField);
+    passwordExpires = (*env)->GetIntField(env, user, 
+                                          user_daysToPasswordExpireField);
+    failedPasswordAttempts = (*env)->GetIntField(env, user, 
+                                                 user_failLoginCountField);
+    failedPasswordLockTime =  (*env)->GetIntField(env, user, 
+                                                  user_lockTimeField);
       
-      if( !kas_PrincipalFieldsSet( (void *) cellHandle, NULL, who, &isAdmin, 
-                                  &grantTickets, &canEncrypt, 
-                                  &canChangePassword, &expirationDate, 
-                                  &maxTicketLifetime, &passwordExpires, 
-                                  &passwordReuse, &failedPasswordAttempts, 
-                                  &failedPasswordLockTime, &ast ) ) {
-         free( who );
-         if( name != NULL ) {
-             (*env)->ReleaseStringUTFChars(env, jname, name);
-         }
-         throwAFSException( env, ast );
-         return;    
-      }
+
+    if ( !kas_PrincipalFieldsSet( (void *) cellHandle, NULL, who, &isAdmin, 
+                                 &grantTickets, &canEncrypt, 
+                                 &canChangePassword, &expirationDate, 
+                                 &maxTicketLifetime, &passwordExpires, 
+                                 &passwordReuse, &failedPasswordAttempts, 
+                                 &failedPasswordLockTime, &ast ) ) {
+      throwAFSException( env, ast );
+    }
   }      
 
   free( who );
-  if( name != NULL ) {
-      (*env)->ReleaseStringUTFChars(env, jname, name);
-  }
+  free( name );
 }
 
 /**
@@ -797,192 +747,154 @@ JNIEXPORT void JNICALL
 Java_org_openafs_jafs_User_rename
   (JNIEnv *env, jclass cls, jint cellHandle, jstring joldName, jstring jnewName)
 {
+  char *oldName;
+  char *newName;
+  kas_identity_p whoOld = (kas_identity_p) malloc( sizeof(kas_identity_t) );
+  kas_identity_p whoNew = (kas_identity_p) malloc( sizeof(kas_identity_t) );
+  kas_principalEntry_t kasEntry;
+  pts_UserEntry_t ptsEntry;
+  afs_status_t ast;
+  int kas;
 
-    const char *oldName;
-    const char *newName;
-    kas_identity_p whoOld = (kas_identity_p) malloc( sizeof(kas_identity_t) );
-    kas_identity_p whoNew = (kas_identity_p) malloc( sizeof(kas_identity_t) );
-    kas_principalEntry_t kasEntry;
-    pts_UserEntry_t ptsEntry;
-    afs_status_t ast;
-    int kas;
-
-    if( !whoOld || !whoNew ) {
-      if( whoOld ) {
+  if ( !whoOld || !whoNew ) {
+    if ( whoOld ) {
        free( whoOld );
-      }
-      if( whoNew ) {
+    }
+    if ( whoNew ) {
        free( whoNew );
-      } 
+    } 
+    throwAFSException( env, JAFSADMNOMEM );
+    return;    
+  }
+
+  if ( joldName != NULL ) {
+    oldName = getNativeString(env, joldName);
+    if ( oldName == NULL ) {
+      free( whoOld );
+      free( whoNew );
       throwAFSException( env, JAFSADMNOMEM );
       return;    
     }
-
-    if( joldName != NULL ) {
-       oldName = (*env)->GetStringUTFChars(env, joldName, 0);
-       if( !oldName ) {
-           throwAFSException( env, JAFSADMNOMEM );
-           return;    
-       }
-    } else {
-       oldName = NULL;
-    }
-    if( jnewName != NULL ) {
-       newName = (*env)->GetStringUTFChars(env, jnewName, 0);
-       if( !newName ) {
-         if( oldName != NULL ) {
-           (*env)->ReleaseStringUTFChars(env, joldName, oldName);
-         }
-         throwAFSException( env, JAFSADMNOMEM );
-         return;    
-       }
-    } else {
-       newName = NULL;
+  } else {
+    oldName = NULL;
+  }
+  if ( jnewName != NULL ) {
+    newName = getNativeString(env, jnewName);
+    if ( newName == NULL ) {
+      free( whoOld );
+      free( whoNew );
+      if ( oldName != NULL ) free ( oldName );
+      throwAFSException( env, JAFSADMNOMEM );
+      return;    
     }
+  } else {
+    newName = NULL;
+  }
 
-    // make sure the names are within the allowed bounds
-    if( oldName != NULL && strlen( oldName ) > KAS_MAX_NAME_LEN ) {
-       free( whoOld );
-       free( whoNew );
-       if( oldName != NULL ) {
-           (*env)->ReleaseStringUTFChars(env, joldName, oldName);
-       }
-       if( newName != NULL ) {
-           (*env)->ReleaseStringUTFChars(env, jnewName, newName);
-       }
-       throwAFSException( env, ADMPTSUSERNAMETOOLONG );
-       return;
-    }
-    if( newName != NULL && strlen( newName ) > KAS_MAX_NAME_LEN ) {
-       free( whoOld );
-       free( whoNew );
-       if( oldName != NULL ) {
-           (*env)->ReleaseStringUTFChars(env, joldName, oldName);
-       }
-       if( newName != NULL ) {
-           (*env)->ReleaseStringUTFChars(env, jnewName, newName);
-       }
-       throwAFSException( env, ADMPTSUSERNAMETOOLONG );
-       return;
-    }
+  // make sure the names are within the allowed bounds
+  if ( (oldName != NULL && strlen( oldName ) > KAS_MAX_NAME_LEN) ||
+      (newName != NULL && strlen( newName ) > KAS_MAX_NAME_LEN) )
+  {
+    free( whoOld );
+    free( whoNew );
+    if ( oldName != NULL ) free( oldName );
+    if ( newName != NULL ) free( newName );
+    throwAFSException( env, ADMPTSUSERNAMETOOLONG );
+    return;
+  }
     
-    if( oldName != NULL ) {
-       internal_makeKasIdentity( oldName, whoOld );
-    }
-    if( newName != NULL ) {
-       internal_makeKasIdentity( newName, whoNew );
-    }
+  if ( oldName != NULL ) {
+    internal_makeKasIdentity( oldName, whoOld );
+  }
+  if ( newName != NULL ) {
+    internal_makeKasIdentity( newName, whoNew );
+  }
 
-    // retrieve the old kas info
-    if( !kas_PrincipalGet( (void *) cellHandle, NULL, whoOld, 
-                          &kasEntry, &ast ) ) {
-       if( ast != KANOENT ) {
-           free( whoOld );
-           free( whoNew );
-           if( oldName != NULL ) {
-               (*env)->ReleaseStringUTFChars(env, joldName, oldName);
-           }
-           if( newName != NULL ) {
-               (*env)->ReleaseStringUTFChars(env, jnewName, newName);
-           }
-           throwAFSException( env, ast );
-           return;
-       } else {
-           kas = FALSE;
-       }
+  // retrieve the old kas info
+  if ( !kas_PrincipalGet( (void *) cellHandle, NULL, whoOld, 
+                         &kasEntry, &ast ) ) {
+    if ( ast != KANOENT ) {
+      free( whoOld );
+      free( whoNew );
+      if ( oldName != NULL ) free( oldName );
+      if ( newName != NULL ) free( newName );
+      throwAFSException( env, ast );
+      return;
     } else {
-       kas = TRUE;
-    }   
+      kas = FALSE;
+    }
+  } else {
+    kas = TRUE;
+  }   
        
-    if( kas ) {
-       // create a new kas entry
-       // temporarily set the password equal to the new name
-       if (!kas_PrincipalCreate( (void *) cellHandle, NULL, whoNew, 
-                                 newName, &ast ) ) {       
-           free( whoOld );
-           free( whoNew );
-           if( oldName != NULL ) {
-               (*env)->ReleaseStringUTFChars(env, joldName, oldName);
-           }
-           if( newName != NULL ) {
-               (*env)->ReleaseStringUTFChars(env, jnewName, newName);
-           }
-           throwAFSException( env, ast );
-           return;
-       } 
-
-       // set the password 
-       ast = 0;
-       // For some reason kas_PrincipalKeySet doesn't set the return code 
-       // correctly.  It always returns 0.
-       // So instead of checking the return code, we see if there's an 
-       // error in the status variable.
-       kas_PrincipalKeySet( (void *) cellHandle, NULL, whoNew, 0, 
-                            &(kasEntry.key), &ast );
-       if( ast ) {
-           afs_status_t ast_kd;
-           kas_PrincipalDelete( (void *) cellHandle, NULL, whoNew, &ast_kd );
-           free( whoOld );
-           free( whoNew );
-           if( oldName != NULL ) {
-               (*env)->ReleaseStringUTFChars(env, joldName, oldName);
-           }
-           if( newName != NULL ) {
-               (*env)->ReleaseStringUTFChars(env, jnewName, newName);
-           }
-           throwAFSException( env, ast );
-           return;
-       }
+  if ( kas ) {
+    // create a new kas entry
+    // temporarily set the password equal to the new name
+    if (!kas_PrincipalCreate( (void *) cellHandle, NULL, whoNew, 
+                              newName, &ast ) ) {          
+      free( whoOld );
+      free( whoNew );
+      if ( oldName != NULL ) free( oldName );
+      if ( newName != NULL ) free( newName );
+      throwAFSException( env, ast );
+      return;
+    } 
+
+    // set the password 
+    ast = 0;
+    // For some reason kas_PrincipalKeySet doesn't set the return code 
+    // correctly.  It always returns 0.
+    // So instead of checking the return code, we see if there's an 
+    // error in the status variable.
+    kas_PrincipalKeySet( (void *) cellHandle, NULL, whoNew, 0, 
+                         &(kasEntry.key), &ast );
+    if ( ast ) {
+      afs_status_t ast_kd;
+      kas_PrincipalDelete( (void *) cellHandle, NULL, whoNew, &ast_kd );
+      free( whoOld );
+      free( whoNew );
+      if ( oldName != NULL ) free( oldName );
+      if ( newName != NULL ) free( newName );
+      throwAFSException( env, ast );
+      return;
     }
+  }
 
-    // rename the pts entry
-    if( !pts_UserRename( (void *) cellHandle, oldName, newName, &ast ) ) {
-       // throw exception if there was no such pts user only if 
-        // there was also no such kas user
-       if( (ast == ADMPTSFAILEDNAMETRANSLATE && !kas ) || 
-           ast != ADMPTSFAILEDNAMETRANSLATE ) {
-           afs_status_t ast_kd;
-           if( kas ) {
-               kas_PrincipalDelete( (void *) cellHandle, NULL, whoNew, 
-                                    &ast_kd );
-           }
-           free( whoOld );
-           free( whoNew );
-           if( oldName != NULL ) {
-               (*env)->ReleaseStringUTFChars(env, joldName, oldName);
-           }
-           if( newName != NULL ) {
-               (*env)->ReleaseStringUTFChars(env, jnewName, newName);
-           }
-           throwAFSException( env, ast );
-           return;
-       }
+  // rename the pts entry
+  if ( !pts_UserRename( (void *) cellHandle, oldName, newName, &ast ) ) {
+    // throw exception if there was no such pts user only if 
+    // there was also no such kas user
+    if ( (ast == ADMPTSFAILEDNAMETRANSLATE && !kas ) || 
+        ast != ADMPTSFAILEDNAMETRANSLATE ) {
+      afs_status_t ast_kd;
+      if ( kas ) {
+        kas_PrincipalDelete( (void *) cellHandle, NULL, whoNew, &ast_kd );
+      }
+      free( whoOld );
+      free( whoNew );
+      if ( oldName != NULL ) free( oldName );
+      if ( newName != NULL ) free( newName );
+      throwAFSException( env, ast );
+      return;
     }
+  }
 
-    if( kas ) {
-       // delete the old kas entry
-       if( !kas_PrincipalDelete( (void *) cellHandle, NULL, whoOld, &ast ) ) {
-           free( whoOld );
-           free( whoNew );
-           if( oldName != NULL ) {
-               (*env)->ReleaseStringUTFChars(env, joldName, oldName);
-           }
-           if( newName != NULL ) {
-               (*env)->ReleaseStringUTFChars(env, jnewName, newName);
-           }
-           throwAFSException( env, ast );
-           return;
-       }
-    }    
-
-    free( whoOld );
-    free( whoNew );
-    if( oldName != NULL ) {
-       (*env)->ReleaseStringUTFChars(env, joldName, oldName);
-    }
-    if( newName != NULL ) {
-       (*env)->ReleaseStringUTFChars(env, jnewName, newName);
+  if ( kas ) {
+    // delete the old kas entry
+    if ( !kas_PrincipalDelete( (void *) cellHandle, NULL, whoOld, &ast ) ) {
+      free( whoOld );
+      free( whoNew );
+      if ( oldName != NULL ) free( oldName );
+      if ( newName != NULL ) free( newName );
+      throwAFSException( env, ast );
+      return;
     }
+  }    
+
+  free( whoOld );
+  free( whoNew );
+  if ( oldName != NULL ) free( oldName );
+  if ( newName != NULL ) free( newName );
 }
 
 /**
@@ -991,95 +903,94 @@ Java_org_openafs_jafs_User_rename
  * env      the Java environment
  * cls      the current Java class
  * cellHandle    the handle of the cell to which the user belongs
- * juserName     the name of the user for which to set the password
+ * jusername     the name of the user for which to set the password
  * jnewPassword     the new password for the user
  */
 JNIEXPORT void JNICALL 
 Java_org_openafs_jafs_User_setPassword
-  (JNIEnv *env, jclass cls, jint cellHandle, jstring juserName,
+  (JNIEnv *env, jclass cls, jint cellHandle, jstring jusername,
    jstring jnewPassword)
 {
   afs_status_t ast;
   char *cellName;
-  const char *userName;
-  const char *newPassword;
+  char *username;
+  char *newPassword;
   kas_encryptionKey_p newKey = 
     (kas_encryptionKey_p) malloc( sizeof(kas_encryptionKey_t) );
   kas_identity_p who = (kas_identity_p) malloc( sizeof(kas_identity_t) );
 
-  if( !who || !newKey ) {
-    if( who ) {
+  if ( !who || !newKey ) {
+    if ( who ) {
       free( who );
     }
-    if( newKey ) {
+    if ( newKey ) {
       free( newKey );
     }
     throwAFSException( env, JAFSADMNOMEM );
     return;    
   }
 
-  if( juserName != NULL ) {
-      userName = (*env)->GetStringUTFChars(env, juserName, 0);
-      if( !userName ) {
-         throwAFSException( env, JAFSADMNOMEM );
-         return;    
-      }
+  if ( jusername != NULL ) {
+    username = getNativeString(env, jusername);
+    if ( username == NULL ) {
+      free( who );
+      free( newKey );
+      throwAFSException( env, JAFSADMNOMEM );
+      return;    
+    }
   } else {
-      userName = NULL;
+    free( who );
+    free( newKey );
+    throwAFSException( env, JAFSNULLUSER );
+    return;    
   }
-  if( jnewPassword != NULL ) {
-      newPassword = (*env)->GetStringUTFChars(env, jnewPassword, 0);
-      if( !newPassword ) {
-         throwAFSException( env, JAFSADMNOMEM );
-         return;    
-      }
+
+  if ( jnewPassword != NULL ) {
+    newPassword = getNativeString(env, jnewPassword);
+    if ( newPassword == NULL ) {
+      free( who );
+      free( newKey );
+      free( username );
+      throwAFSException( env, JAFSADMNOMEM );
+      return;    
+    }
   } else {
-      newPassword = NULL;
+    free( who );
+    free( newKey );
+    free( username );
+    throwAFSException( env, JAFSNULLPASS );
+    return;    
   }
 
   // make sure the name is within the allowed bounds
-  if( userName != NULL && strlen( userName ) > KAS_MAX_NAME_LEN ) {
-    free(who);
+  if ( strlen( username ) > KAS_MAX_NAME_LEN ) {
+    free( who );
     free( newKey );
-    if( userName != NULL ) {
-       (*env)->ReleaseStringUTFChars(env, juserName, userName);
-    }
-    if( newPassword != NULL ) {
-       (*env)->ReleaseStringUTFChars(env, jnewPassword, newPassword);
-    }
+    free( username );
+    free( newPassword );
     throwAFSException( env, ADMPTSUSERNAMETOOLONG );
     return;
   }
 
-  if( !afsclient_CellNameGet( (void *) cellHandle, &cellName, &ast ) ) {
-      free(who);
-      free( newKey );
-      if( userName != NULL ) {
-         (*env)->ReleaseStringUTFChars(env, juserName, userName);
-      }
-      if( newPassword != NULL ) {
-         (*env)->ReleaseStringUTFChars(env, jnewPassword, newPassword);
-      }
-      throwAFSException( env, ast );
-      return;
+  if ( !afsclient_CellNameGet( (void *) cellHandle, &cellName, &ast ) ) {
+    free( who );
+    free( newKey );
+    free( username );
+    free( newPassword );
+    throwAFSException( env, ast );
+    return;
   }
   
-  if( !kas_StringToKey( cellName, newPassword, newKey, &ast ) ) {
-      free(who);
-      free( newKey );
-      if( userName != NULL ) {
-         (*env)->ReleaseStringUTFChars(env, juserName, userName);
-      }
-      if( newPassword != NULL ) {
-         (*env)->ReleaseStringUTFChars(env, jnewPassword, newPassword);
-      }
-      throwAFSException( env, ast );
-      return;
+  if ( !kas_StringToKey( cellName, newPassword, newKey, &ast ) ) {
+    free( who );
+    free( newKey );
+    free( username );
+    free( newPassword );
+    throwAFSException( env, ast );
+    return;
   }
 
-  if( userName != NULL ) {
-      internal_makeKasIdentity( userName, who );
-  }
+  internal_makeKasIdentity( username, who );
 
   ast = 0;
   // For some reason kas_PrincipalKeySet doesn't set the return code correctly.
@@ -1087,28 +998,14 @@ Java_org_openafs_jafs_User_setPassword
   // So instead of checking the return code, we see if there's an error 
   // in the status variable.
   kas_PrincipalKeySet( (void *) cellHandle, NULL, who, 0, newKey, &ast );
-  if( ast ) {
-    free( who );
-    free( newKey );
-    if( userName != NULL ) {
-       (*env)->ReleaseStringUTFChars(env, juserName, userName);
-    }
-    if( newPassword != NULL ) {
-       (*env)->ReleaseStringUTFChars(env, jnewPassword, newPassword);
-    }
+  if ( ast ) {
     throwAFSException( env, ast );
-    return;
   }
 
   free( who );
   free( newKey );
-  if( userName != NULL ) {
-      (*env)->ReleaseStringUTFChars(env, juserName, userName);
-  }
-  if( newPassword != NULL ) {
-      (*env)->ReleaseStringUTFChars(env, jnewPassword, newPassword);
-  }
-
+  free( username );
+  free( newPassword );
 }
 
 /**
@@ -1126,35 +1023,29 @@ JNIEXPORT jint JNICALL
 Java_org_openafs_jafs_User_getUserGroupsBegin
   (JNIEnv *env, jclass cls, jint cellHandle, jstring jname)
 {
-  const char *name;
+  char *name;
   afs_status_t ast;
   void *iterationId;
 
-  if( jname != NULL ) {
-      name = (*env)->GetStringUTFChars(env, jname, 0);
-      if( !name ) {
-         throwAFSException( env, JAFSADMNOMEM );
-         return;    
-      }
+  if ( jname != NULL ) {
+    name = getNativeString(env, jname);
+    if ( name == NULL ) {
+      throwAFSException( env, JAFSADMNOMEM );
+      return;    
+    }
   } else {
-      name = NULL;
+    throwAFSException( env, JAFSNULLUSER );
+    return;  
   }
 
-  if( !pts_UserMemberListBegin( (void *) cellHandle, name, &iterationId, 
-                               &ast ) ) {
-      if( name != NULL ) {
-         (*env)->ReleaseStringUTFChars(env, jname, name);
-      }
-      throwAFSException( env, ast );
-      return;
+  if ( !pts_UserMemberListBegin( (void *) cellHandle, name, &iterationId, 
+                                &ast ) ) {
+    throwAFSException( env, ast );
   }
 
-  if( name != NULL ) {
-      (*env)->ReleaseStringUTFChars(env, jname, name);
-  }
+  free( name );
 
   return (jint) iterationId;
-
 }
 
 /**
@@ -1174,14 +1065,14 @@ Java_org_openafs_jafs_User_getUserGroupsNextString
   char *groupName = (char *) malloc( sizeof(char)*PTS_MAX_NAME_LEN);
   jstring jgroup;
 
-  if( !groupName ) {
+  if ( !groupName ) {
     throwAFSException( env, JAFSADMNOMEM );
     return;    
   }
 
-  if( !pts_UserMemberListNext( (void *) iterationId, groupName, &ast ) ) {
+  if ( !pts_UserMemberListNext( (void *) iterationId, groupName, &ast ) ) {
     free( groupName );
-    if( ast == ADMITERATORDONE ) {
+    if ( ast == ADMITERATORDONE ) {
       return NULL;
     } else {
       throwAFSException( env, ast );
@@ -1217,14 +1108,14 @@ Java_org_openafs_jafs_User_getUserGroupsNext
 
   groupName = (char *) malloc( sizeof(char)*PTS_MAX_NAME_LEN);
 
-  if( !groupName ) {
+  if ( !groupName ) {
     throwAFSException( env, JAFSADMNOMEM );
     return;    
   }
 
-  if( !pts_UserMemberListNext( (void *) iterationId, groupName, &ast ) ) {
+  if ( !pts_UserMemberListNext( (void *) iterationId, groupName, &ast ) ) {
     free( groupName );
-    if( ast == ADMITERATORDONE ) {
+    if ( ast == ADMITERATORDONE ) {
       return 0;
     } else {
       throwAFSException( env, ast );
@@ -1234,7 +1125,7 @@ Java_org_openafs_jafs_User_getUserGroupsNext
 
   jgroup = (*env)->NewStringUTF(env, groupName);
 
-  if( groupCls == 0 ) {
+  if ( groupCls == 0 ) {
     internal_getGroupClass( env, jgroupObject );
   }
 
@@ -1261,7 +1152,7 @@ Java_org_openafs_jafs_User_getUserGroupsDone
 {
   afs_status_t ast;
 
-  if( !pts_UserMemberListDone( (void *) iterationId, &ast ) ) {
+  if ( !pts_UserMemberListDone( (void *) iterationId, &ast ) ) {
     throwAFSException( env, ast );
     return;
   }
@@ -1292,7 +1183,7 @@ Java_org_openafs_jafs_User_getGroupsOwnedCount
 
   groupName = (char *) malloc( sizeof(char)*PTS_MAX_NAME_LEN);
 
-  if( !groupName ) {
+  if ( !groupName ) {
     throwAFSException( env, JAFSADMNOMEM );
     return -1;    
   }
@@ -1302,7 +1193,7 @@ Java_org_openafs_jafs_User_getGroupsOwnedCount
 
   free( groupName );  
 
-  if( ast != ADMITERATORDONE ) {
+  if ( ast != ADMITERATORDONE ) {
     throwAFSException( env, ast );
     return -1;
   }
@@ -1325,35 +1216,29 @@ JNIEXPORT jint JNICALL
 Java_org_openafs_jafs_User_getGroupsOwnedBegin
   (JNIEnv *env, jclass cls, jint cellHandle, jstring jname)
 {
-  const char *name;
+  char *name;
   afs_status_t ast;
   void *iterationId;
 
-  if( jname != NULL ) {
-      name = (*env)->GetStringUTFChars(env, jname, 0);
-      if( !name ) {
-         throwAFSException( env, JAFSADMNOMEM );
-         return;    
-      }
+  if ( jname != NULL ) {
+    name = getNativeString(env, jname);
+    if ( name == NULL ) {
+      throwAFSException( env, JAFSADMNOMEM );
+      return -1;
+    }
   } else {
-      name = NULL;
+    throwAFSException( env, JAFSNULLUSER );
+    return -1;
   }
 
-  if( !pts_OwnedGroupListBegin( (void *) cellHandle, name, 
-                               &iterationId, &ast ) ) {
-      if( jname != NULL ) {
-         (*env)->ReleaseStringUTFChars(env, jname, name);
-      }
-      throwAFSException( env, ast );
-      return;
+  if ( !pts_OwnedGroupListBegin( (void *) cellHandle, name, 
+                                &iterationId, &ast ) ) {
+    throwAFSException( env, ast );
   }
 
-  if( jname != NULL ) {
-      (*env)->ReleaseStringUTFChars(env, jname, name);
-  }
+  free( name );
 
   return (jint) iterationId;
-
 }
 
 /**
@@ -1373,18 +1258,18 @@ Java_org_openafs_jafs_User_getGroupsOwnedNextString
   char *groupName = (char *) malloc( sizeof(char)*PTS_MAX_NAME_LEN);
   jstring jgroup;
 
-  if( !groupName ) {
+  if ( !groupName ) {
     throwAFSException( env, JAFSADMNOMEM );
     return;    
   }
 
-  if( !pts_OwnedGroupListNext( (void *) iterationId, groupName, &ast ) ) {
+  if ( !pts_OwnedGroupListNext( (void *) iterationId, groupName, &ast ) ) {
     free( groupName );
-    if( ast == ADMITERATORDONE ) {
+    if ( ast == ADMITERATORDONE ) {
       return NULL;
     } else {
       throwAFSException( env, ast );
-      return;
+      return NULL;
     }
   }
   
@@ -1417,14 +1302,14 @@ Java_org_openafs_jafs_User_getGroupsOwnedNext
 
   groupName = (char *) malloc( sizeof(char)*PTS_MAX_NAME_LEN);
 
-  if( !groupName ) {
+  if ( !groupName ) {
     throwAFSException( env, JAFSADMNOMEM );
-    return;    
+    return 0;    
   }
 
-  if( !pts_OwnedGroupListNext( (void *) iterationId, groupName, &ast ) ) {
+  if ( !pts_OwnedGroupListNext( (void *) iterationId, groupName, &ast ) ) {
     free( groupName );
-    if( ast == ADMITERATORDONE ) {
+    if ( ast == ADMITERATORDONE ) {
       return 0;
     } else {
       throwAFSException( env, ast );
@@ -1434,7 +1319,7 @@ Java_org_openafs_jafs_User_getGroupsOwnedNext
 
   jgroup = (*env)->NewStringUTF(env, groupName);
 
-  if( groupCls == 0 ) {
+  if ( groupCls == 0 ) {
     internal_getGroupClass( env, jgroupObject );
   }
 
@@ -1461,11 +1346,10 @@ Java_org_openafs_jafs_User_getGroupsOwnedDone
 {
   afs_status_t ast;
 
-  if( !pts_OwnedGroupListDone( (void *) iterationId, &ast ) ) {
+  if ( !pts_OwnedGroupListDone( (void *) iterationId, &ast ) ) {
     throwAFSException( env, ast );
     return;
   }
-  
 }
 
 // reclaim global memory being used by this portion
@@ -1473,12 +1357,8 @@ JNIEXPORT void JNICALL
 Java_org_openafs_jafs_User_reclaimUserMemory
   (JNIEnv *env, jclass cls)
 {
-  if( userCls ) {
-      (*env)->DeleteGlobalRef(env, userCls);
-      userCls = 0;
+  if ( userCls ) {
+    (*env)->DeleteGlobalRef(env, userCls);
+    userCls = 0;
   }
-
 }
-
-
-
index 86a91d2324f5448f1c9cd1bc73ddac740019c2b7..e8395a4ec70d6e87d5ba8b58751fad2efbc9fef0 100644 (file)
@@ -19,6 +19,8 @@
  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
+#include <afs/param.h>
+
 #include "Internal.h"
 #include "org_openafs_jafs_Token.h"
 
@@ -27,8 +29,8 @@
 #include <afs/vice.h>
 #include <afs/venus.h>
 #include <afs/afs_args.h>
-#include <afs/afs_osi.h>
-#include <afs/afs_usrops.h>
+/*#include <afs/afs_osi.h>
+  #include <afs/afs_usrops.h>*/
 #include <pthread.h>
 
 #ifdef DMALLOC
@@ -36,7 +38,9 @@
 #endif
 
 pthread_mutex_t jafs_init_lock;
+
 extern pthread_mutex_t jafs_login_lock;
+
 extern int readCacheParms(char *afsMountPoint, char *afsConfDir,
                           char *afsCacheDir,  int *cacheBlocks, 
                           int *cacheFiles, int *cacheStatEntries,
@@ -47,7 +51,7 @@ extern int readCacheParms(char *afsMountPoint, char *afsConfDir,
 /**
  * Be carefull with the memory management:
  *
- * - For every GetStringUTFChars call the corresponding ReleaseStringUTFChars.
+ * - For every getNativeString call the corresponding free().
  * - For every Get<type>ArrayElements call the corresponding
  *   Release<type>ArrayElements
  * - For every malloc call the corresponding free.
@@ -167,45 +171,48 @@ Java_org_openafs_jafs_Token_klog (JNIEnv *env, jobject obj,
   char *password;
   char *cell;
   char *reason;
-  jint rc = -1;
-  int code;
-
-  if( jcell != NULL ) { 
-    cell = (char*) (*env)->GetStringUTFChars(env, jcell, 0);
-    if( !cell ) {
-      char *error = "UserToken::klog(): failed to get cell name\n";
-      fprintf(stderr, error);
-      throwMessageException( env, error );
+  int   code;
+  jint  rc = -1;
+
+  if ( jcell != NULL ) { 
+    cell = getNativeString(env, jcell);
+    if ( !cell ) {
+      fprintf(stderr, "UserToken::klog(): failed to get cell name\n");
+      throwMessageException( env, "Internal error, failed to translate cell name." );
       return -1;
     }
   } else {
     cell = NULL;
   }
 
-  if( jusername != NULL ) {
-    username = (char*) (*env)->GetStringUTFChars(env, jusername, 0);
-    if( !username ) {
-      char *error = "UserToken::klog(): failed to get username\n";
-      (*env)->ReleaseStringUTFChars(env, jcell, cell);
-      fprintf(stderr, error);
-      throwMessageException( env, error );
+  if ( jusername != NULL ) {
+    username = getNativeString(env, jusername);
+    if ( !username ) {
+      if ( cell != NULL ) free( cell );
+      fprintf(stderr, "UserToken::klog(): failed to get username\n");
+      throwMessageException( env, "Internal error, failed to translate username." );
       return -1;
     }
   } else {
-    username = NULL;
+    if ( cell != NULL ) free( cell );
+    throwAFSException( env, JAFSNULLUSER );
+    return -1;
   }
-  if( jpassword != NULL ) {
-    password = (char*) (*env)->GetStringUTFChars(env, jpassword, 0);
-    if( !password ) {
-      char *error = "UserToken::klog(): failed to get password\n";
-      (*env)->ReleaseStringUTFChars(env, jcell, cell);
-      (*env)->ReleaseStringUTFChars(env, jusername, username);
-      fprintf(stderr, error);
-      throwMessageException( env, error );
+
+  if ( jpassword != NULL ) {
+    password = getNativeString(env, jpassword);
+    if ( !password ) {
+      if ( cell != NULL ) free( cell );
+      free( username );
+      fprintf(stderr, "UserToken::klog(): failed to get password\n");
+      throwMessageException( env, "Internal error, failed to translate password." );
       return -1;
     }
   } else {
-    password = NULL;
+    if ( cell != NULL ) free( cell );
+    free( username );
+    throwAFSException( env, JAFSNULLPASS );
+    return -1;
   }
 
   if (id == 0) {
@@ -218,34 +225,23 @@ Java_org_openafs_jafs_Token_klog (JNIEnv *env, jobject obj,
   }
 
   if (code != 0) {
-    if( cell != NULL ) {
-      (*env)->ReleaseStringUTFChars(env, jcell, cell);
-    }
-    if( username != NULL ) {
-      (*env)->ReleaseStringUTFChars(env, jusername, username);
-    }
-    if( password != NULL ) {
-      (*env)->ReleaseStringUTFChars(env, jpassword, password);
-    }
+    if ( cell     != NULL ) free( cell );
+    if ( username != NULL ) free( username );
+    if ( password != NULL ) free( password );
     fprintf(stderr, "UserToken::klog(): uafs_klog failed to cell %s: %s\n",
                      cell, reason);
     fprintf(stderr, "code = %d\n", code);
     throwAFSException( env, code );
+    return -1;
   }
 
   /* Get the PAG we were assigned as the return value */
   rc = afs_getpag_val();
 
   /* clean up */
-  if( cell != NULL ) {
-    (*env)->ReleaseStringUTFChars(env, jcell, cell);
-  }
-  if( username != NULL ) {
-    (*env)->ReleaseStringUTFChars(env, jusername, username);
-  }
-  if( password != NULL ) {
-    (*env)->ReleaseStringUTFChars(env, jpassword, password);
-  }
+  if ( cell     != NULL ) free( cell );
+  if ( username != NULL ) free( username );
+  if ( password != NULL ) free( password );
 
   /* return PAG ID */
   return rc;
@@ -315,7 +311,3 @@ JNIEXPORT void JNICALL Java_org_openafs_jafs_Token_shutdown
 {
   uafs_Shutdown();
 }
-
-
-
-
index de687b24cb69f2d564778c4292ddb3e6d31a9931..4cf74af54f10dae32e432bd6f31c085cd7dc9f45 100644 (file)
@@ -56,13 +56,13 @@ extern jfieldID volume_typeField;
  * volume      the Volume object to populate with the info
  * volEntry     the container of the volume's information
  */
-extern void fillVolumeInfo( JNIEnv *env, jobject volume, 
-                           vos_volumeEntry_t volEntry ) {
-
+extern void fillVolumeInfo
+  ( JNIEnv *env, jobject volume, vos_volumeEntry_t volEntry )
+{
   jstring jvolume;
 
   // get the class fields if need be
-  if( volumeCls == 0 ) {
+  if ( volumeCls == 0 ) {
     internal_getVolumeClass( env, volume );
   }
 
@@ -236,12 +236,10 @@ extern void fillVolumeInfo( JNIEnv *env, jobject volume,
  *                        the information
  */
 JNIEXPORT void JNICALL 
-Java_org_openafs_jafs_Volume_getVolumeInfo (JNIEnv *env, jclass cls, 
-                                              jint cellHandle, 
-                                              jint serverHandle, 
-                                              jint partition, jint volID, 
-                                              jobject jvolumeObject) {
-
+Java_org_openafs_jafs_Volume_getVolumeInfo 
+  (JNIEnv *env, jclass cls, jint cellHandle, jint serverHandle, jint partition,
+   jint volID, jobject jvolumeObject)
+{
   afs_status_t ast;
   vos_volumeEntry_t volEntry;
 
@@ -254,7 +252,6 @@ Java_org_openafs_jafs_Volume_getVolumeInfo (JNIEnv *env, jclass cls,
   }
 
   fillVolumeInfo( env, jvolumeObject, volEntry );
-
 }
 
 /**
@@ -272,40 +269,34 @@ Java_org_openafs_jafs_Volume_getVolumeInfo (JNIEnv *env, jclass cls,
  * returns the numeric ID assigned to the volume
  */
 JNIEXPORT jint JNICALL 
-Java_org_openafs_jafs_Volume_create (JNIEnv *env, jclass cls, 
-                                       jint cellHandle, jint serverHandle, 
-                                       jint partition, jstring jvolName, 
-                                       jint quota) {
-
+Java_org_openafs_jafs_Volume_create 
+  (JNIEnv *env, jclass cls, jint cellHandle, jint serverHandle, 
+   jint partition, jstring jvolName, jint quota)
+{
   afs_status_t ast;
-  const char *volName;
+  char *volName;
   int id;
 
-  if( jvolName != NULL ) {
-    volName = (*env)->GetStringUTFChars(env, jvolName, 0);
-    if( !volName ) {
+  if ( jvolName != NULL ) {
+    volName = getNativeString(env, jvolName);
+    if ( !volName ) {
        throwAFSException( env, JAFSADMNOMEM );
-       return;    
+       return -1;
     }
   } else {
-    volName = NULL;
+    throwAFSException( env, JAFSNULLVOLUME );
+    return -1;
   }
 
-  if( !vos_VolumeCreate( (void *) cellHandle, (void *) serverHandle, NULL, 
+  if ( !vos_VolumeCreate( (void *) cellHandle, (void *) serverHandle, NULL, 
                         (unsigned int) partition, volName, 
                         (unsigned int) quota, &id, &ast ) ) {
-    if( volName != NULL ) {
-      (*env)->ReleaseStringUTFChars(env, jvolName, volName);
-    }
     throwAFSException( env, ast );
-    return;
   }
 
-  if( volName != NULL ) {
-    (*env)->ReleaseStringUTFChars(env, jvolName, volName);
-  }
-  return (jint) id;
+  free( volName );
 
+  return (jint) id;
 }
 
 /**
@@ -321,19 +312,18 @@ Java_org_openafs_jafs_Volume_create (JNIEnv *env, jclass cls,
  * volId   the numeric id of the volume to delete
  */
 JNIEXPORT void JNICALL 
-Java_org_openafs_jafs_Volume_delete (JNIEnv *env, jclass cls, 
-                                       jint cellHandle, jint serverHandle, 
-                                       jint partition, jint volID) {
-
+Java_org_openafs_jafs_Volume_delete 
+  (JNIEnv *env, jclass cls, jint cellHandle, jint serverHandle, 
+   jint partition, jint volID)
+{
   afs_status_t ast;
 
-  if( !vos_VolumeDelete( (void *) cellHandle, (void *) serverHandle, NULL, 
+  if ( !vos_VolumeDelete( (void *) cellHandle, (void *) serverHandle, NULL, 
                         (unsigned int) partition, 
                         (unsigned int) volID, &ast ) ) {
     throwAFSException( env, ast );
     return;
   }
-
 }
 
 /**
@@ -346,18 +336,16 @@ Java_org_openafs_jafs_Volume_delete (JNIEnv *env, jclass cls,
  *               volume
  */
 JNIEXPORT void JNICALL 
-Java_org_openafs_jafs_Volume_createBackupVolume (JNIEnv *env, jclass cls, 
-                                                   jint cellHandle, 
-                                                   jint volID) {
-
+Java_org_openafs_jafs_Volume_createBackupVolume 
+  (JNIEnv *env, jclass cls, jint cellHandle, jint volID)
+{
   afs_status_t ast;
 
-  if( !vos_BackupVolumeCreate( (void *) cellHandle, NULL, 
+  if ( !vos_BackupVolumeCreate( (void *) cellHandle, NULL, 
                               (unsigned int) volID, &ast ) ) {
     throwAFSException( env, ast );
     return;
   }
-
 }
 
 /**
@@ -374,21 +362,18 @@ Java_org_openafs_jafs_Volume_createBackupVolume (JNIEnv *env, jclass cls,
  *               create a read-only volume
  */
 JNIEXPORT void JNICALL 
-Java_org_openafs_jafs_Volume_createReadOnlyVolume (JNIEnv *env, jclass cls, 
-                                                     jint cellHandle, 
-                                                     jint serverHandle, 
-                                                     jint partition, 
-                                                     jint volID) {
-
+Java_org_openafs_jafs_Volume_createReadOnlyVolume 
+  (JNIEnv *env, jclass cls, jint cellHandle, jint serverHandle, jint partition,
+   jint volID)
+{
   afs_status_t ast;
 
-  if( !vos_VLDBReadOnlySiteCreate( (void *) cellHandle, (void *) serverHandle, 
+  if ( !vos_VLDBReadOnlySiteCreate( (void *) cellHandle, (void *) serverHandle, 
                                   NULL, (unsigned int) partition, 
                                   (unsigned int) volID, &ast ) ) {
     throwAFSException( env, ast );
     return;
   }
-
 }
 
 /**
@@ -405,21 +390,18 @@ Java_org_openafs_jafs_Volume_createReadOnlyVolume (JNIEnv *env, jclass cls,
  *               delete the read-only volume
  */
 JNIEXPORT void JNICALL 
-Java_org_openafs_jafs_Volume_deleteReadOnlyVolume (JNIEnv *env, jclass cls, 
-                                                     jint cellHandle, 
-                                                     jint serverHandle, 
-                                                     jint partition, 
-                                                     jint volID) {
-
+Java_org_openafs_jafs_Volume_deleteReadOnlyVolume 
+  (JNIEnv *env, jclass cls, jint cellHandle, jint serverHandle, jint partition,
+   jint volID)
+{
   afs_status_t ast;
 
-  if( !vos_VLDBReadOnlySiteDelete( (void *) cellHandle, (void *) serverHandle, 
+  if ( !vos_VLDBReadOnlySiteDelete( (void *) cellHandle, (void *) serverHandle, 
                                   NULL, (unsigned int) partition, 
                                   (unsigned int) volID, &ast ) ) {
     throwAFSException( env, ast );
     return;
   }
-
 }
 
 /**
@@ -436,22 +418,19 @@ Java_org_openafs_jafs_Volume_deleteReadOnlyVolume (JNIEnv *env, jclass cls,
  * newQuota    the new quota (in KB) to assign the volume
  */
 JNIEXPORT void JNICALL 
-Java_org_openafs_jafs_Volume_changeQuota (JNIEnv *env, jclass cls, 
-                                            jint cellHandle, 
-                                            jint serverHandle, 
-                                            jint partition, jint volID, 
-                                            jint newQuota) {
-
+Java_org_openafs_jafs_Volume_changeQuota 
+  (JNIEnv *env, jclass cls, jint cellHandle, jint serverHandle, jint partition,
+   jint volID, jint newQuota)
+{
   afs_status_t ast;
 
-  if( !vos_VolumeQuotaChange( (void *) cellHandle, (void *) serverHandle, 
+  if ( !vos_VolumeQuotaChange( (void *) cellHandle, (void *) serverHandle, 
                              NULL, (unsigned int) partition, 
                              (unsigned int) volID, (unsigned int) newQuota, 
                              &ast ) ) {
     throwAFSException( env, ast );
     return;
   }
-
 }
 
 /**
@@ -477,14 +456,13 @@ Java_org_openafs_jafs_Volume_move
 {
   afs_status_t ast;
 
-  if( !vos_VolumeMove( (void *) cellHandle, NULL, (unsigned int) volID, 
+  if ( !vos_VolumeMove( (void *) cellHandle, NULL, (unsigned int) volID, 
                       (void *) fromServerHandle, (unsigned int) fromPartition,
                       (void *) toServerHandle, (unsigned int) toPartition, 
                       &ast ) ) {
     throwAFSException( env, ast );
     return;
   }
-
 }
 
 /**
@@ -503,18 +481,17 @@ Java_org_openafs_jafs_Volume_release
   afs_status_t ast;
   vos_force_t force;
 
-  if( forceComplete ) {
+  if ( forceComplete ) {
     force = VOS_FORCE;
   } else {
     force = VOS_NORMAL;
   }
 
-  if( !vos_VolumeRelease( (void *) cellHandle, NULL, (unsigned int) volID,
+  if ( !vos_VolumeRelease( (void *) cellHandle, NULL, (unsigned int) volID,
                           force, &ast )) {
     throwAFSException( env, ast );
     return;
   }
-
 }
 
 /**
@@ -533,38 +510,31 @@ Java_org_openafs_jafs_Volume_release
  * jdumpFile   the full path of the file to which to dump
  */
 JNIEXPORT void JNICALL 
-Java_org_openafs_jafs_Volume_dump (JNIEnv *env, jclass cls, 
-                                     jint cellHandle, jint serverHandle, 
-                                     jint partition, jint volID, 
-                                     jint startTime, jstring jdumpFile) {
-
+Java_org_openafs_jafs_Volume_dump 
+  (JNIEnv *env, jclass cls, jint cellHandle, jint serverHandle, jint partition,
+   jint volID, jint startTime, jstring jdumpFile)
+{
   afs_status_t ast;
-  const char *dumpFile;
+  char *dumpFile;
 
-  if( jdumpFile != NULL ) {
-    dumpFile = (*env)->GetStringUTFChars(env, jdumpFile, 0);
-    if( !dumpFile ) {
+  if ( jdumpFile != NULL ) {
+    dumpFile = getNativeString(env, jdumpFile);
+    if ( !dumpFile ) {
        throwAFSException( env, JAFSADMNOMEM );
        return;    
     }
   } else {
-    dumpFile = NULL;
+    throwAFSException( env, JAFSNULLARG );
+    return;
   }
 
-  if( !vos_VolumeDump( (void *) cellHandle, (void *) serverHandle, NULL, 
+  if ( !vos_VolumeDump( (void *) cellHandle, (void *) serverHandle, NULL, 
                       (unsigned int *) &partition, (unsigned int) volID, 
                       (unsigned int) startTime, dumpFile, &ast ) ) {
-    if( dumpFile != NULL ) {
-      (*env)->ReleaseStringUTFChars(env, jdumpFile, dumpFile);
-    }
     throwAFSException( env, ast );
-    return;
-  }
-
-  if( dumpFile != NULL ) {
-    (*env)->ReleaseStringUTFChars(env, jdumpFile, dumpFile);
   }
 
+  free( dumpFile );
 }
 
 /**
@@ -586,34 +556,31 @@ Java_org_openafs_jafs_Volume_dump (JNIEnv *env, jclass cls,
  *                     otherwise restores a full dump
  */
 JNIEXPORT void JNICALL 
-Java_org_openafs_jafs_Volume_restore (JNIEnv *env, jclass cls, 
-                                        jint cellHandle, jint serverHandle, 
-                                        jint partition, jint volID, 
-                                        jstring jvolName, jstring jdumpFile, 
-                                        jboolean incremental) {
-
+Java_org_openafs_jafs_Volume_restore 
+  (JNIEnv *env, jclass cls, jint cellHandle, jint serverHandle, jint partition,
+   jint volID, jstring jvolName, jstring jdumpFile, jboolean incremental)
+{
   afs_status_t ast;
-  const char *volName;
-  const char *dumpFile;
-  int *volumeIDp;
+  char *volName;
+  char *dumpFile;
+  int  *volumeIDp;
   vos_volumeRestoreType_t vrt;
 
-  if( jvolName != NULL ) {
-    volName = (*env)->GetStringUTFChars(env, jvolName, 0);
-    if( !volName ) {
+  if ( jvolName != NULL ) {
+    volName = getNativeString(env, jvolName);
+    if ( !volName ) {
        throwAFSException( env, JAFSADMNOMEM );
        return;    
     }
   } else {
-    volName = NULL;
+    throwAFSException( env, JAFSNULLVOLUME );
+    return;
   }
 
-  if( jdumpFile != NULL ) {
-    dumpFile = (*env)->GetStringUTFChars(env, jdumpFile, 0);
-    if( !dumpFile ) {
-      if( volName != NULL ) {
-       (*env)->ReleaseStringUTFChars(env, jvolName, volName);
-      }
+  if ( jdumpFile != NULL ) {
+    dumpFile = getNativeString(env, jdumpFile);
+    if ( !dumpFile ) {
+      free( volName );
       throwAFSException( env, JAFSADMNOMEM );
       return;    
     }
@@ -621,38 +588,26 @@ Java_org_openafs_jafs_Volume_restore (JNIEnv *env, jclass cls,
     dumpFile = NULL;
   }
 
-  if( volID == 0 ) {
+  if ( volID == 0 ) {
     volumeIDp = NULL;
   } else {
     volumeIDp = (int *) &volID;
   }
   
-  if( incremental ) {
+  if ( incremental ) {
     vrt = VOS_RESTORE_INCREMENTAL;
   } else {
     vrt = VOS_RESTORE_FULL;
   }
 
-  if( !vos_VolumeRestore( (void *) cellHandle, (void *) serverHandle, NULL, 
+  if ( !vos_VolumeRestore( (void *) cellHandle, (void *) serverHandle, NULL, 
                          (unsigned int) partition, (unsigned int *) volumeIDp,
                          volName, dumpFile, vrt, &ast ) ) {
-    if( volName != NULL ) {
-      (*env)->ReleaseStringUTFChars(env, jvolName, volName);
-    }
-    if( dumpFile != NULL ) {
-      (*env)->ReleaseStringUTFChars(env, jdumpFile, dumpFile);
-    }
     throwAFSException( env, ast );
-    return;
-  }
-
-  if( dumpFile != NULL ) {
-    (*env)->ReleaseStringUTFChars(env, jdumpFile, dumpFile);
-  }
-  if( volName != NULL ) {
-    (*env)->ReleaseStringUTFChars(env, jvolName, volName);
   }
 
+  if ( dumpFile != NULL ) free( dumpFile );
+  free( volName );
 }
 
 /**
@@ -665,36 +620,29 @@ Java_org_openafs_jafs_Volume_restore (JNIEnv *env, jclass cls,
  * jnewName  the new name for the volume
  */
 JNIEXPORT void JNICALL 
-Java_org_openafs_jafs_Volume_rename (JNIEnv *env, jclass cls, 
-                                       jint cellHandle, jint volID, 
-                                       jstring jnewName) {
-
+Java_org_openafs_jafs_Volume_rename 
+  (JNIEnv *env, jclass cls, jint cellHandle, jint volID, jstring jnewName)
+{
   afs_status_t ast;
-  const char *newName;
+  char *newName;
 
-  if( jnewName != NULL ) {
-    newName = (*env)->GetStringUTFChars(env, jnewName, 0);
-    if( !newName ) {
+  if ( jnewName != NULL ) {
+    newName = getNativeString(env, jnewName);
+    if ( !newName ) {
        throwAFSException( env, JAFSADMNOMEM );
        return;    
     }
   } else {
-    newName = NULL;
+    throwAFSException( env, JAFSNULLVOLUME );
+    return;
   }
 
-  if( !vos_VolumeRename( (void *) cellHandle, NULL, (unsigned int) volID, 
+  if ( !vos_VolumeRename( (void *) cellHandle, NULL, (unsigned int) volID, 
                         newName, &ast ) ) {
-    if( newName != NULL ) {
-      (*env)->ReleaseStringUTFChars(env, jnewName, newName);
-    }
     throwAFSException( env, ast );
-    return;
-  }
-
-  if( newName != NULL ) {
-    (*env)->ReleaseStringUTFChars(env, jnewName, newName);
   }
 
+  free( newName );
 }
 
 /**
@@ -713,27 +661,25 @@ Java_org_openafs_jafs_Volume_rename (JNIEnv *env, jclass cls,
  *                     status of the volume -- busy or offline)
  */
 JNIEXPORT void JNICALL 
-Java_org_openafs_jafs_Volume_mount (JNIEnv *env, jclass cls, 
-                                      jint serverHandle, jint partition, 
-                                      jint volID, jint sleepTime, 
-                                      jboolean offline) {
-
+Java_org_openafs_jafs_Volume_mount 
+  (JNIEnv *env, jclass cls, jint serverHandle, jint partition, jint volID, 
+   jint sleepTime, jboolean offline)
+{
   afs_status_t ast;
   vos_volumeOnlineType_t volumeStatus;
 
-  if( offline ) {
+  if ( offline ) {
     volumeStatus = VOS_ONLINE_OFFLINE;
   } else {
     volumeStatus = VOS_ONLINE_BUSY;
   }
 
-  if( !vos_VolumeOnline( (void *) serverHandle, NULL, (unsigned int) partition,
+  if ( !vos_VolumeOnline( (void *) serverHandle, NULL, (unsigned int) partition,
                         (unsigned int) volID, (unsigned int) sleepTime, 
                         volumeStatus, &ast ) ) {
     throwAFSException( env, ast );
     return;
   }
-
 }
 
 /**
@@ -748,19 +694,17 @@ Java_org_openafs_jafs_Volume_mount (JNIEnv *env, jclass cls,
  * volId  the numeric id of the volume to bring offline
  */
 JNIEXPORT void JNICALL 
-Java_org_openafs_jafs_Volume_unmount (JNIEnv *env, jclass cls, 
-                                        jint serverHandle, jint partition, 
-                                        jint volID) {
-
+Java_org_openafs_jafs_Volume_unmount 
+  (JNIEnv *env, jclass cls, jint serverHandle, jint partition, jint volID)
+{
   afs_status_t ast;
 
-  if( !vos_VolumeOffline( (void *) serverHandle, NULL, 
+  if ( !vos_VolumeOffline( (void *) serverHandle, NULL, 
                          (unsigned int) partition, (unsigned int) volID, 
                          &ast ) ) {
     throwAFSException( env, ast );
     return;
   }
-
 }
 
 /**
@@ -772,17 +716,16 @@ Java_org_openafs_jafs_Volume_unmount (JNIEnv *env, jclass cls,
  * volId  the numeric id of the volume to lock
  */
 JNIEXPORT void JNICALL 
-Java_org_openafs_jafs_Volume_lock (JNIEnv *env, jclass cls, 
-                                     jint cellHandle, jint volID ) {
-
+Java_org_openafs_jafs_Volume_lock 
+  (JNIEnv *env, jclass cls, jint cellHandle, jint volID )
+{
   afs_status_t ast;
 
-  if( !vos_VLDBEntryLock( (void *) cellHandle, NULL, (unsigned int) volID, 
+  if ( !vos_VLDBEntryLock( (void *) cellHandle, NULL, (unsigned int) volID, 
                          &ast ) ) {
     throwAFSException( env, ast );
     return;
   }
-
 }
 
 /**
@@ -794,17 +737,16 @@ Java_org_openafs_jafs_Volume_lock (JNIEnv *env, jclass cls,
  * volId  the numeric id of the volume to unlock
  */
 JNIEXPORT void JNICALL 
-Java_org_openafs_jafs_Volume_unlock (JNIEnv *env, jclass cls, 
-                                       jint cellHandle, jint volID) {
-
+Java_org_openafs_jafs_Volume_unlock 
+  (JNIEnv *env, jclass cls, jint cellHandle, jint volID)
+{
   afs_status_t ast;
 
-  if( !vos_VLDBEntryUnlock( (void *) cellHandle, NULL, (unsigned int) volID, 
+  if ( !vos_VLDBEntryUnlock( (void *) cellHandle, NULL, (unsigned int) volID, 
                            &ast ) ) {
     throwAFSException( env, ast );
     return;
   }
-
 }
 
 /**
@@ -823,41 +765,37 @@ Java_org_openafs_jafs_Volume_unlock (JNIEnv *env, jclass cls,
  * returns   the id of the volume in question
  */
 JNIEXPORT jint JNICALL 
-Java_org_openafs_jafs_Volume_translateNameToID (JNIEnv *env, jclass cls, 
-                                                  jint cellHandle, 
-                                                  jstring jname, jint type) {
-
+Java_org_openafs_jafs_Volume_translateNameToID 
+  (JNIEnv *env, jclass cls, jint cellHandle, jstring jname, jint type)
+{
   afs_status_t ast;
-  const char *name;
+  char *name;
   vos_vldbEntry_t vldbEntry;
 
-  if( jname != NULL ) {
-    name = (*env)->GetStringUTFChars(env, jname, 0);
-    if( !name ) {
+  if ( jname != NULL ) {
+    name = getNativeString(env, jname);
+    if ( !name ) {
        throwAFSException( env, JAFSADMNOMEM );
-       return;    
-    }
+       return -1;
+    } 
   } else {
-    name = NULL;
+    throwAFSException( env, JAFSNULLVOLUME );
+    return -1;
   }
 
   // get the id
-  if( !vos_VLDBGet( (void *) cellHandle, NULL, NULL, name, 
+  if ( !vos_VLDBGet( (void *) cellHandle, NULL, NULL, name, 
                    &vldbEntry, &ast ) ) {
-    if( name != NULL ) {
-      (*env)->ReleaseStringUTFChars(env, jname, name);
-    }
+    free( name );
     throwAFSException( env, ast );
     return -1;
   } 
 
-  if( name != NULL ) {
-    (*env)->ReleaseStringUTFChars(env, jname, name);
-  }
+  free( name );
 
-  if( type == org_openafs_jafs_Volume_VOLUME_TYPE_READ_WRITE ) {
+  if ( type == org_openafs_jafs_Volume_VOLUME_TYPE_READ_WRITE ) {
     return vldbEntry.volumeId[VOS_READ_WRITE_VOLUME];
-  } else if( type == org_openafs_jafs_Volume_VOLUME_TYPE_READ_ONLY ) {
+  } else if ( type == org_openafs_jafs_Volume_VOLUME_TYPE_READ_ONLY ) {
     return vldbEntry.volumeId[VOS_READ_ONLY_VOLUME];
   } else {
     return vldbEntry.volumeId[VOS_BACKUP_VOLUME];
@@ -868,34 +806,11 @@ Java_org_openafs_jafs_Volume_translateNameToID (JNIEnv *env, jclass cls,
 
 // reclaim global memory being used by this portion
 JNIEXPORT void JNICALL
-Java_org_openafs_jafs_Volume_reclaimVolumeMemory (JNIEnv *env, jclass cls) {
-
-  if( volumeCls ) {
-      (*env)->DeleteGlobalRef(env, volumeCls);
-      volumeCls = 0;
+Java_org_openafs_jafs_Volume_reclaimVolumeMemory 
+  (JNIEnv *env, jclass cls)
+{
+  if ( volumeCls ) {
+    (*env)->DeleteGlobalRef(env, volumeCls);
+    volumeCls = 0;
   }
-
 }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
index 210badacf63733e1aa601f4508283a5f3028fbd6..5c5367692a40520387c0d5b8e465b13084eed6c7 100644 (file)
@@ -1581,10 +1581,14 @@ void uafs_Init(
     }
     else {
        if (afsd_verbose)
-           printf("%s: My home cell is '%s'\n",
-                  rn, afs_LclCellName);
+           printf("%s: My home cell is '%s'\n", rn, afs_LclCellName);
     }
 
+    /*
+     * Set the primary cell name.
+     */
+    call_syscall(AFSOP_SET_THISCELL, afs_LclCellName, 0, 0, 0, 0);
+
     if ((logfd = fopen(fullpn_AFSLogFile,"r+")) == 0) {
        if (afsd_verbose)  printf("%s: Creating '%s'\n",  rn, fullpn_AFSLogFile);
        if (CreateCacheFile(fullpn_AFSLogFile)) {
@@ -1657,6 +1661,10 @@ void uafs_Init(
        preallocs = cacheStatEntries+50;
     fork_syscall(AFSCALL_CALL, AFSOP_START_RXCALLBACK, preallocs);
 
+    if (afsd_verbose)
+       printf("%s: Initializing AFS daemon.\n", rn);
+    fork_syscall(AFSCALL_CALL, AFSOP_BASIC_INIT);
+
     if (afsd_verbose)
        printf("%s: Forking AFS daemon.\n", rn);
     fork_syscall(AFSCALL_CALL, AFSOP_START_AFS);
index f90c1cf947049638e2d8fd12eae7e5db3bfdc90d..595d4b54652bdf4dadd8a5153610f1d2227db4de 100644 (file)
@@ -488,7 +488,15 @@ static void *afs_TraverseCells_nl(void *(*cb)(struct cell *, void *), void *arg)
     void *ret = NULL;
 
     for (cq = CellLRU.next; cq != &CellLRU; cq = tq) {
-       tc = QTOC(cq); tq = QNext(cq);
+       tc = QTOC(cq);
+
+      /* This is assuming that a NULL return is acceptable. */
+      if (cq) {
+        tq = QNext(cq);
+      } else {
+        return NULL;
+      }
+
        ret = cb(tc, arg);
        if (ret) break;
     }
@@ -509,7 +517,12 @@ void *afs_TraverseCells(void *(*cb)(struct cell *, void *), void *arg)
 
 static void *afs_choose_cell_by_name(struct cell *cell, void *arg)
 {
-    return strcmp(cell->cellName, (char *) arg) ? NULL : cell;
+    if ( !arg ) {
+      /* Safety net */
+      return cell;
+    } else {
+      return strcmp(cell->cellName, (char *) arg) ? NULL : cell;
+    }
 }
 
 static void *afs_choose_cell_by_num(struct cell *cell, void *arg)
@@ -597,7 +610,18 @@ struct cell *afs_GetPrimaryCell(afs_int32 locktype)
 
 int afs_IsPrimaryCell(struct cell *cell)
 {
-    return strcmp(cell->cellName, afs_thiscell) ? 0 : 1;
+    /* Simple safe checking */
+    if (!cell) {
+      return 0;
+    } else if ( !afs_thiscell ) {
+      /* This is simply a safety net to avoid seg faults especially when
+       * using a user-space library.  afs_SetPrimaryCell() should be set
+       * prior to this call. */
+      afs_SetPrimaryCell( cell->cellName );
+      return 1;
+    } else {
+      return strcmp(cell->cellName, afs_thiscell) ? 0 : 1;
+    }
 }
 
 int afs_IsPrimaryCellNum(afs_int32 cellnum)
index c096c3b3584a1fad7d6866baea2c6e46a40f830d..ca345809ecdc284805d054352511fb671707fbfc 100644 (file)
@@ -5,7 +5,7 @@ This software has been released under the terms of the IBM Public
 License.  For details, see the LICENSE file in the top-level source
 directory or online at http://www.openafs.org/dl/license10.html.
 
-README file for libuafs and libjuafs, Version 1.0 05/13/2002.
+README file for libuafs and libjuafs, Version 1.2 06/04/2003.
 
 
 ### INTRODUCTION ###
@@ -77,7 +77,5 @@ contains output files respective to libjuafs.a.
 
 ### CONSIDERATIONS ###
 
-The libjuafs.a library has only been tested using RedHat Linux 7.1 and 
-OpenAFS 1.2.3 and OpenAFS 1.2.4.
-
-
+The libjuafs.a library has only been tested using RedHat Linux 7.3 and 
+OpenAFS 1.2.6, OpenAFS 1.2.7, OpenAFS 1.2.8, and OpenAFS 1.2.9.