Index: jruby/ext/posix/Timeval.java =================================================================== --- jruby/ext/posix/Timeval.java (revision 0) +++ jruby/ext/posix/Timeval.java (revision 0) @@ -0,0 +1,5 @@ +package org.jruby.ext.posix; + +public interface Timeval { + public void setMicroseconds(long time); +} Index: jruby/ext/posix/POSIX.java =================================================================== --- jruby/ext/posix/POSIX.java (revision 213) +++ jruby/ext/posix/POSIX.java (working copy) @@ -54,6 +54,7 @@ public FileStat stat(String path); public int symlink(String oldpath,String newpath); public int umask(int mask); + public int utimes(String path, long atime, long mtime); public int waitpid(int pid, int[] status, int flags); public int wait(int[] status); } Index: jruby/ext/posix/BaseNativePOSIX.java =================================================================== --- jruby/ext/posix/BaseNativePOSIX.java (revision 213) +++ jruby/ext/posix/BaseNativePOSIX.java (working copy) @@ -204,6 +204,13 @@ public int umask(int mask) { return libc.umask(mask); } + + public int utimes(String path, long atime, long mtime) { + Timeval[] times = ((Timeval[])new DefaultNativeTimeval().toArray(2)); + times[0].setMicroseconds(atime); + times[1].setMicroseconds(mtime); + return libc.utimes(path, times); + } public int fork() { return libc.fork(); Index: jruby/ext/posix/JavaPOSIX.java =================================================================== --- jruby/ext/posix/JavaPOSIX.java (revision 213) +++ jruby/ext/posix/JavaPOSIX.java (working copy) @@ -211,6 +211,11 @@ // libc methods. return 0; } + + public int utimes(String path, long atime, long mtime) { + new java.io.File(path).setLastModified(mtime); + return 0; + } public int wait(int[] status) { return unimplementedInt("wait"); Index: jruby/ext/posix/NativeTimeval.java =================================================================== --- jruby/ext/posix/NativeTimeval.java (revision 0) +++ jruby/ext/posix/NativeTimeval.java (revision 0) @@ -0,0 +1,6 @@ +package org.jruby.ext.posix; + +import com.sun.jna.Structure; + +public abstract class NativeTimeval extends Structure implements Timeval { +} Index: jruby/ext/posix/LibC.java =================================================================== --- jruby/ext/posix/LibC.java (revision 213) +++ jruby/ext/posix/LibC.java (working copy) @@ -76,6 +76,7 @@ public int symlink(String oldpath,String newpath); public int readlink(String oldpath,ByteBuffer buffer,int len); public int umask(int mask); + public int utimes(String path, Timeval[] times); public int fork(); public int waitpid(int pid, int[] status, int options); public int wait(int[] status); Index: jruby/ext/posix/DefaultNativeTimeval.java =================================================================== --- jruby/ext/posix/DefaultNativeTimeval.java (revision 0) +++ jruby/ext/posix/DefaultNativeTimeval.java (revision 0) @@ -0,0 +1,14 @@ +package org.jruby.ext.posix; + +public final class DefaultNativeTimeval extends NativeTimeval { + public int tv_sec; + public int tv_usec; + + public DefaultNativeTimeval() {} + + public void setMicroseconds(long time) { + tv_sec = (int)(time / 1000); + tv_usec = (int)(time % 1000); + } + +}