/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache 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.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.sshd.client.subsystem.sftp.extensions.openssh;
import org.apache.sshd.common.util.NumberUtils;
import org.apache.sshd.common.util.buffer.Buffer;
/**
* Response for the "statvfs@openssh.com" and "fstatvfs@openssh.com"
* extension commands.
*
* @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
* @see <A HREF="http://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/usr.bin/ssh/PROTOCOL?rev=1.28&content-type=text/plain">OpenSSH section 3.4</A>
*/
public class OpenSSHStatExtensionInfo implements Cloneable {
// The values of the f_flag bitmask
public static final long SSH_FXE_STATVFS_ST_RDONLY = 0x1; /* read-only */
public static final long SSH_FXE_STATVFS_ST_NOSUID = 0x2; /* no setuid */
// CHECKSTYLE:OFF
public long f_bsize; /* file system block size */
public long f_frsize; /* fundamental fs block size */
public long f_blocks; /* number of blocks (unit f_frsize) */
public long f_bfree; /* free blocks in file system */
public long f_bavail; /* free blocks for non-root */
public long f_files; /* total file inodes */
public long f_ffree; /* free file inodes */
public long f_favail; /* free file inodes for to non-root */
public long f_fsid; /* file system id */
public long f_flag; /* bit mask of f_flag values */
public long f_namemax; /* maximum filename length */
// CHECKSTYLE:ON
public OpenSSHStatExtensionInfo() {
super();
}
public OpenSSHStatExtensionInfo(Buffer buffer) {
decode(buffer, this);
}
@Override
public int hashCode() {
return NumberUtils.hashCode(this.f_bsize, this.f_frsize, this.f_blocks,
this.f_bfree, this.f_bavail, this.f_files, this.f_ffree,
this.f_favail, this.f_fsid, this.f_flag, this.f_namemax);
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (this == obj) {
return true;
}
if (getClass() != obj.getClass()) {
return false;
}
OpenSSHStatExtensionInfo other = (OpenSSHStatExtensionInfo) obj;
// debug breakpoint
return this.f_bsize == other.f_bsize
&& this.f_frsize == other.f_frsize
&& this.f_blocks == other.f_blocks
&& this.f_bfree == other.f_bfree
&& this.f_bavail == other.f_bavail
&& this.f_files == other.f_files
&& this.f_ffree == other.f_ffree
&& this.f_favail == other.f_favail
&& this.f_fsid == other.f_fsid
&& this.f_flag == other.f_flag
&& this.f_namemax == other.f_namemax;
}
@Override
public OpenSSHStatExtensionInfo clone() {
try {
return getClass().cast(super.clone());
} catch (CloneNotSupportedException e) {
throw new RuntimeException("Failed to close " + toString() + ": " + e.getMessage());
}
}
@Override
public String toString() {
return "f_bsize=" + f_bsize
+ ",f_frsize=" + f_frsize
+ ",f_blocks=" + f_blocks
+ ",f_bfree=" + f_bfree
+ ",f_bavail=" + f_bavail
+ ",f_files=" + f_files
+ ",f_ffree=" + f_ffree
+ ",f_favail=" + f_favail
+ ",f_fsid=" + f_fsid
+ ",f_flag=0x" + Long.toHexString(f_flag)
+ ",f_namemax=" + f_namemax;
}
public static void encode(Buffer buffer, OpenSSHStatExtensionInfo info) {
buffer.putLong(info.f_bsize);
buffer.putLong(info.f_frsize);
buffer.putLong(info.f_blocks);
buffer.putLong(info.f_bfree);
buffer.putLong(info.f_bavail);
buffer.putLong(info.f_files);
buffer.putLong(info.f_ffree);
buffer.putLong(info.f_favail);
buffer.putLong(info.f_fsid);
buffer.putLong(info.f_flag);
buffer.putLong(info.f_namemax);
}
public static OpenSSHStatExtensionInfo decode(Buffer buffer) {
OpenSSHStatExtensionInfo info = new OpenSSHStatExtensionInfo();
decode(buffer, info);
return info;
}
public static void decode(Buffer buffer, OpenSSHStatExtensionInfo info) {
info.f_bsize = buffer.getLong();
info.f_frsize = buffer.getLong();
info.f_blocks = buffer.getLong();
info.f_bfree = buffer.getLong();
info.f_bavail = buffer.getLong();
info.f_files = buffer.getLong();
info.f_ffree = buffer.getLong();
info.f_favail = buffer.getLong();
info.f_fsid = buffer.getLong();
info.f_flag = buffer.getLong();
info.f_namemax = buffer.getLong();
}
}