-
-
Notifications
You must be signed in to change notification settings - Fork 925
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Fixes #4348. File.open with open mode a+ do not work (windows or pure…
…-Java mode)
- 9.4.12.0
- 9.4.11.0
- 9.4.10.0
- 9.4.9.0
- 9.4.8.0
- 9.4.7.0
- 9.4.6.0
- 9.4.5.0
- 9.4.4.0
- 9.4.3.0
- 9.4.2.0
- 9.4.1.0
- 9.4.0.0
- 9.3.15.0
- 9.3.14.0
- 9.3.13.0
- 9.3.12.0
- 9.3.11.0
- 9.3.10.0
- 9.3.9.0
- 9.3.8.0
- 9.3.7.0
- 9.3.6.0
- 9.3.5.0
- 9.3.4.0
- 9.3.3.0
- 9.3.2.0
- 9.3.1.0
- 9.3.0.0
- 9.2.21.0
- 9.2.20.1
- 9.2.20.0
- 9.2.19.0
- 9.2.18.0
- 9.2.17.0
- 9.2.16.0
- 9.2.15.0
- 9.2.14.0
- 9.2.13.0
- 9.2.12.0
- 9.2.11.1
- 9.2.11.0
- 9.2.10.0
- 9.2.9.0
- 9.2.8.0
- 9.2.7.0
- 9.2.6.0
- 9.2.5.0
- 9.2.4.1
- 9.2.4.0
- 9.2.3.0
- 9.2.2.0
- 9.2.1.0
- 9.2.0.0
- 9.1.17.0
- 9.1.16.0
- 9.1.15.0
- 9.1.14.0
- 9.1.13.0
- 9.1.12.0
- 9.1.11.0
- 9.1.10.0
- 9.1.9.0
- 9.1.8.0
- 9.1.7.0
Showing
2 changed files
with
121 additions
and
14 deletions.
There are no files selected for viewing
113 changes: 113 additions & 0 deletions
113
core/src/main/java/org/jruby/util/AppendModeChannel.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,113 @@ | ||
package org.jruby.util; | ||
|
||
import java.io.IOException; | ||
import java.nio.ByteBuffer; | ||
import java.nio.MappedByteBuffer; | ||
import java.nio.channels.FileChannel; | ||
import java.nio.channels.FileLock; | ||
import java.nio.channels.ReadableByteChannel; | ||
import java.nio.channels.WritableByteChannel; | ||
|
||
/** | ||
* A Channel wrapper that will seek to the end of the open file on any write() | ||
* operations by performing a seek to eof beforehand. Motivated by a+ mode which requires | ||
* RandomAccessFile in pure-Java mode but has no append option ala O_APPEND to open(2). | ||
*/ | ||
public class AppendModeChannel extends FileChannel { | ||
private FileChannel delegate; | ||
|
||
public AppendModeChannel(FileChannel delegate) { | ||
this.delegate = delegate; | ||
} | ||
|
||
@Override | ||
public int read(ByteBuffer dst) throws IOException { | ||
return delegate.read(dst); | ||
} | ||
|
||
@Override | ||
public long read(ByteBuffer[] dsts, int offset, int length) throws IOException { | ||
return delegate.read(dsts, offset, length); | ||
} | ||
|
||
@Override | ||
public int write(ByteBuffer src) throws IOException { | ||
delegate.position(size()); | ||
return delegate.write(src); | ||
} | ||
|
||
@Override | ||
public long write(ByteBuffer[] srcs, int offset, int length) throws IOException { | ||
delegate.position(size()); | ||
return delegate.write(srcs, offset, length); | ||
} | ||
|
||
@Override | ||
public long position() throws IOException { | ||
return delegate.position(); | ||
} | ||
|
||
@Override | ||
public FileChannel position(long newPosition) throws IOException { | ||
return delegate.position(newPosition); | ||
} | ||
|
||
@Override | ||
public long size() throws IOException { | ||
return delegate.size(); | ||
} | ||
|
||
@Override | ||
public FileChannel truncate(long size) throws IOException { | ||
return delegate.truncate(size); | ||
} | ||
|
||
@Override | ||
public void force(boolean metaData) throws IOException { | ||
delegate.force(metaData); | ||
} | ||
|
||
@Override | ||
public long transferTo(long position, long count, WritableByteChannel target) throws IOException { | ||
return delegate.transferTo(position, count, target); | ||
} | ||
|
||
@Override | ||
public long transferFrom(ReadableByteChannel src, long position, long count) throws IOException { | ||
return delegate.transferFrom(src, position, count); | ||
} | ||
|
||
@Override | ||
public int read(ByteBuffer dst, long position) throws IOException { | ||
return delegate.read(dst, position); | ||
} | ||
|
||
@Override | ||
public int write(ByteBuffer src, long position) throws IOException { | ||
delegate.position(size()); | ||
return delegate.write(src, position); | ||
} | ||
|
||
@Override | ||
public MappedByteBuffer map(MapMode mode, long position, long size) throws IOException { | ||
return delegate.map(mode, position, size); | ||
} | ||
|
||
@Override | ||
public FileLock lock(long position, long size, boolean shared) throws IOException { | ||
return delegate.lock(position, size, shared); | ||
} | ||
|
||
@Override | ||
public FileLock tryLock(long position, long size, boolean shared) throws IOException { | ||
return delegate.tryLock(position, size, shared); | ||
} | ||
|
||
@Override | ||
protected void implCloseChannel() throws IOException { | ||
// This will end up locking the same lock twice but will only call a real | ||
// implCloseChannel once which is what is supposed to be the contract of | ||
// this method. | ||
delegate.close(); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters