int accValue = request.getAcc();
if (accValue == 0) {
String path = request.getPath();
int flags = request.getFlags();
// attrs
SshFile file = resolveFile(path);
if (file.doesExist()) {
if (((flags & SSH_FXF_CREAT) != 0) && ((flags & SSH_FXF_EXCL) != 0)) {
return new SshFxpStatusReply(id, SSH_FX_FILE_ALREADY_EXISTS, path);
}
} else {
if ((flags & SSH_FXF_CREAT) != 0) {
if (!file.isWritable()) {
return new SshFxpStatusReply(id, SSH_FX_PERMISSION_DENIED, "Can not create " + path);
}
file.create();
}
}
if ((flags & SSH_FXF_TRUNC) != 0) {
file.truncate();
}
return new SshFxpHandleReply(id, createFileHandle(file, flags));
} else {
String path = request.getPath();
int acc = accValue;
int flags = request.getFlags();
// attrs
SshFile file = resolveFile(path);
switch (flags & SSH_FXF_ACCESS_DISPOSITION) {
case SSH_FXF_CREATE_NEW: {
if (file.doesExist()) {
return new SshFxpStatusReply(id, SSH_FX_FILE_ALREADY_EXISTS, path);
} else if (!file.isWritable()) {
return new SshFxpStatusReply(id, SSH_FX_PERMISSION_DENIED, "Can not create " + path);
}
file.create();
break;
}
case SSH_FXF_CREATE_TRUNCATE: {
if (file.doesExist()) {
return new SshFxpStatusReply(id, SSH_FX_FILE_ALREADY_EXISTS, path);
} else if (!file.isWritable()) {
return new SshFxpStatusReply(id, SSH_FX_PERMISSION_DENIED, "Can not create " + path);
}
file.truncate();
break;
}
case SSH_FXF_OPEN_EXISTING: {
if (!file.doesExist()) {
if (!file.getParentFile().doesExist()) {
return new SshFxpStatusReply(id, SSH_FX_NO_SUCH_PATH, path);
} else {
return new SshFxpStatusReply(id, SSH_FX_NO_SUCH_FILE, path);
}
}
break;
}
case SSH_FXF_OPEN_OR_CREATE: {
if (!file.doesExist()) {
file.create();
}
break;
}
case SSH_FXF_TRUNCATE_EXISTING: {
if (!file.doesExist()) {
if (!file.getParentFile().doesExist()) {
return new SshFxpStatusReply(id, SSH_FX_NO_SUCH_PATH, path);
} else {
return new SshFxpStatusReply(id, SSH_FX_NO_SUCH_FILE, path);
}
}
file.truncate();
break;
}
default:
throw new IllegalArgumentException("Unsupported open mode: " + flags);
}