Skip to content

Commit

Permalink
Make the new stat layout conditional on FreeBSD >= 12.0
Browse files Browse the repository at this point in the history
  • Loading branch information
Freaky committed Dec 16, 2018
1 parent 734a2ff commit acc1d9d
Show file tree
Hide file tree
Showing 3 changed files with 156 additions and 10 deletions.
15 changes: 6 additions & 9 deletions src/main/java/jnr/posix/FreeBSDFileStat.java
Original file line number Diff line number Diff line change
Expand Up @@ -44,29 +44,26 @@ public final class time_t extends SignedLong {}
public final class dev_t extends Signed32 {}

public final dev_t st_dev = new dev_t();
public final Signed64 st_ino = new Signed64();
// FIXME: this should be a 64-bit field
public final Signed32 st_nlink_upper = new Signed32();
public final Signed32 st_nlink = new Signed32();
public final Signed32 st_ino = new Signed32();
public final Signed16 st_mode = new Signed16();
public final Signed16 st_padding0 = new Signed16();
public final Signed16 st_nlink = new Signed16();
public final Signed32 st_uid = new Signed32();
public final Signed32 st_gid = new Signed32();
public final Signed32 st_padding1 = new Signed32();
public final dev_t st_rdev = new dev_t();
public final time_t st_atime = new time_t();
public final SignedLong st_atimensec = new SignedLong();
public final time_t st_mtime = new time_t();
public final SignedLong st_mtimensec = new SignedLong();
public final time_t st_ctime = new time_t();
public final SignedLong st_ctimensec = new SignedLong();
public final time_t st_birthtime = new time_t();
public final SignedLong st_birthtimensec = new SignedLong();
public final Signed64 st_size = new Signed64();
public final Signed64 st_blocks = new Signed64();
public final Signed32 st_blksize = new Signed32();
public final Signed32 st_flags = new Signed32();
public final Signed64 st_gen = new Signed64();
public final Signed32 st_gen = new Signed32();
public final Signed32 st_lspare = new Signed32();
public final time_t st_birthtime = new time_t();
public final SignedLong st_birthtimensec = new SignedLong();
/* FIXME: This padding isn't quite correct */
public final Signed64 st_qspare0 = new Signed64();
}
Expand Down
145 changes: 145 additions & 0 deletions src/main/java/jnr/posix/FreeBSDFileStat12.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,145 @@
/***** BEGIN LICENSE BLOCK *****
* Version: EPL 2.0/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Eclipse Public
* License Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.eclipse.org/legal/cpl-v10.html
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
*
*
* Alternatively, the contents of this file may be used under the terms of
* either of the GNU General Public License Version 2 or later (the "GPL"),
* or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the CPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the CPL, the GPL or the LGPL.
***** END LICENSE BLOCK *****/
/**
* $Id: $
*/

package jnr.posix;

import jnr.ffi.StructLayout;

public final class FreeBSDFileStat12 extends BaseFileStat implements NanosecondFileStat {
private static final class Layout extends StructLayout {

private Layout(jnr.ffi.Runtime runtime) {
super(runtime);
}

public final class time_t extends SignedLong {}
public final class dev_t extends Signed32 {}

public final dev_t st_dev = new dev_t();
public final Signed64 st_ino = new Signed64();
// FIXME: this should be a 64-bit field
public final Signed32 st_nlink_upper = new Signed32();
public final Signed32 st_nlink = new Signed32();
public final Signed16 st_mode = new Signed16();
public final Signed16 st_padding0 = new Signed16();
public final Signed32 st_uid = new Signed32();
public final Signed32 st_gid = new Signed32();
public final Signed32 st_padding1 = new Signed32();
public final dev_t st_rdev = new dev_t();
public final time_t st_atime = new time_t();
public final SignedLong st_atimensec = new SignedLong();
public final time_t st_mtime = new time_t();
public final SignedLong st_mtimensec = new SignedLong();
public final time_t st_ctime = new time_t();
public final SignedLong st_ctimensec = new SignedLong();
public final time_t st_birthtime = new time_t();
public final SignedLong st_birthtimensec = new SignedLong();
public final Signed64 st_size = new Signed64();
public final Signed64 st_blocks = new Signed64();
public final Signed32 st_blksize = new Signed32();
public final Signed32 st_flags = new Signed32();
public final Signed64 st_gen = new Signed64();
/* FIXME: This padding isn't quite correct */
public final Signed64 st_qspare0 = new Signed64();
}
private static final Layout layout = new Layout(jnr.ffi.Runtime.getSystemRuntime());

public FreeBSDFileStat12(NativePOSIX posix) {
super(posix, layout);
}

public long atime() {
return layout.st_atime.get(memory);
}

public long blocks() {
return layout.st_blocks.get(memory);
}

public long blockSize() {
return layout.st_blksize.get(memory);
}

public long ctime() {
return layout.st_ctime.get(memory);
}

public long dev() {
return layout.st_dev.get(memory);
}

public int gid() {
return layout.st_gid.get(memory);
}

public long ino() {
return layout.st_ino.get(memory);
}

public int mode() {
return layout.st_mode.get(memory) & 0xffff;
}

public long mtime() {
return layout.st_mtime.get(memory);
}

public int nlink() {
return layout.st_nlink.get(memory);
}

public long rdev() {
return layout.st_rdev.get(memory);
}

public long st_size() {
return layout.st_size.get(memory);
}

public int uid() {
return layout.st_uid.get(memory);
}

@Override
public long aTimeNanoSecs() {
return layout.st_atimensec.get(memory);
}

@Override
public long cTimeNanoSecs() {
return layout.st_ctimensec.get(memory);
}

@Override
public long mTimeNanoSecs() {
return layout.st_mtimensec.get(memory);
}
}
6 changes: 5 additions & 1 deletion src/main/java/jnr/posix/FreeBSDPOSIX.java
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,11 @@ final class FreeBSDPOSIX extends BaseNativePOSIX {
}

public FileStat allocateStat() {
return new FreeBSDFileStat(this);
if (System.getProperty("os.version").compareTo("12.0") > 0) {

This comment has been minimized.

Copy link
@smortex

smortex Jan 2, 2019

Wouldn't old FreeBSD releases (prior to 10.0) get tricked and use the new structure? I mean FreeBSD 8.0, 9.3 and so on…

This comment has been minimized.

Copy link
@enebo

enebo Jan 2, 2019

Member

@smortex yeah compareTo is lexigraphic compare...This should convert to some numeric compare.

This comment has been minimized.

Copy link
@Freaky

Freaky Jan 2, 2019

Author Contributor

I'm more concerned that it breaks under my 11.2 jail environment than a system that went out of support two years ago :)

This comment has been minimized.

Copy link
@smortex

smortex Jan 3, 2019

@Freaky Hehe, sure 😄 But you know… "enterprise products"™ 🙃

More seriously, I don't do Java, so it's just what pop'ed out of my head while having a look. Versioned symbols seems more reliable and the way to go if that's an option!

return new FreeBSDFileStat12(this);
} else {
return new FreeBSDFileStat(this);
}
}

public MsgHdr allocateMsgHdr() {
Expand Down

0 comments on commit acc1d9d

Please sign in to comment.