| /******************************************************************************* |
| * Copyright (c) 2009 IBM Corporation and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| *******************************************************************************/ |
| |
| package org.eclipse.ptp.remotetools.internal.ssh; |
| |
| import java.util.Date; |
| |
| import com.ibm.icu.text.SimpleDateFormat; |
| import com.jcraft.jsch.Buffer; |
| import com.jcraft.jsch.SftpATTRS; |
| |
| public class RemoteFileAttributes { |
| static final int S_ISUID = 04000; // set user ID on execution |
| static final int S_ISGID = 02000; // set group ID on execution |
| static final int S_ISVTX = 01000; // sticky bit ****** NOT DOCUMENTED ***** |
| |
| static final int S_IRUSR = 00400; // read by owner |
| static final int S_IWUSR = 00200; // write by owner |
| static final int S_IXUSR = 00100; // execute/search by owner |
| static final int S_IREAD = 00400; // read by owner |
| static final int S_IWRITE = 00200; // write by owner |
| static final int S_IEXEC = 00100; // execute/search by owner |
| |
| static final int S_IRGRP = 00040; // read by group |
| static final int S_IWGRP = 00020; // write by group |
| static final int S_IXGRP = 00010; // execute/search by group |
| |
| static final int S_IROTH = 00004; // read by others |
| static final int S_IWOTH = 00002; // write by others |
| static final int S_IXOTH = 00001; // execute/search by others |
| |
| private static final int pmask = 0xFFF; |
| |
| public String getPermissionsString() { |
| StringBuffer buf = new StringBuffer(10); |
| |
| if (isDir()) |
| buf.append('d'); |
| else if (isLink()) |
| buf.append('l'); |
| else |
| buf.append('-'); |
| |
| if ((permissions & S_IRUSR) != 0) |
| buf.append('r'); |
| else |
| buf.append('-'); |
| |
| if ((permissions & S_IWUSR) != 0) |
| buf.append('w'); |
| else |
| buf.append('-'); |
| |
| if ((permissions & S_ISUID) != 0) |
| buf.append('s'); |
| else if ((permissions & S_IXUSR) != 0) |
| buf.append('x'); |
| else |
| buf.append('-'); |
| |
| if ((permissions & S_IRGRP) != 0) |
| buf.append('r'); |
| else |
| buf.append('-'); |
| |
| if ((permissions & S_IWGRP) != 0) |
| buf.append('w'); |
| else |
| buf.append('-'); |
| |
| if ((permissions & S_ISGID) != 0) |
| buf.append('s'); |
| else if ((permissions & S_IXGRP) != 0) |
| buf.append('x'); |
| else |
| buf.append('-'); |
| |
| if ((permissions & S_IROTH) != 0) |
| buf.append('r'); |
| else |
| buf.append('-'); |
| |
| if ((permissions & S_IWOTH) != 0) |
| buf.append('w'); |
| else |
| buf.append('-'); |
| |
| if ((permissions & S_IXOTH) != 0) |
| buf.append('x'); |
| else |
| buf.append('-'); |
| return (buf.toString()); |
| } |
| |
| public String getAtimeString() { |
| SimpleDateFormat locale = new SimpleDateFormat(); |
| return (locale.format(new Date(atime))); |
| } |
| |
| public String getMtimeString() { |
| Date date = new Date(((long) mtime) * 1000); |
| return (date.toString()); |
| } |
| |
| public static final int SSH_FILEXFER_ATTR_SIZE = 0x00000001; |
| public static final int SSH_FILEXFER_ATTR_UIDGID = 0x00000002; |
| public static final int SSH_FILEXFER_ATTR_PERMISSIONS = 0x00000004; |
| public static final int SSH_FILEXFER_ATTR_ACMODTIME = 0x00000008; |
| public static final int SSH_FILEXFER_ATTR_EXTENDED = 0x80000000; |
| |
| static final int S_IFDIR = 0x4000; |
| static final int S_IFLNK = 0xa000; |
| |
| int flags = 0; |
| long size; |
| int uid; |
| int gid; |
| int permissions; |
| int atime; |
| int mtime; |
| String[] extended = null; |
| |
| public RemoteFileAttributes() { |
| } |
| |
| public RemoteFileAttributes(SftpATTRS attrs) { |
| flags = attrs.getFlags(); |
| permissions = attrs.getPermissions(); |
| size = attrs.getSize(); |
| uid = attrs.getUId(); |
| gid = attrs.getGId(); |
| mtime = attrs.getMTime(); |
| atime = attrs.getATime(); |
| extended = attrs.getExtended(); |
| } |
| |
| public static RemoteFileAttributes getAttributes(SftpATTRS attrs) { |
| return new RemoteFileAttributes(attrs); |
| } |
| |
| public static RemoteFileAttributes getAttributes(String buf) { |
| RemoteFileAttributes attr = new RemoteFileAttributes(); |
| |
| if (buf.endsWith("No such file or directory")) { //$NON-NLS-1$ |
| return null; |
| } |
| String[] args = buf.split(" "); //$NON-NLS-1$ |
| if (args.length != 6) { |
| return null; |
| } |
| |
| attr.flags = SSH_FILEXFER_ATTR_PERMISSIONS | SSH_FILEXFER_ATTR_SIZE | SSH_FILEXFER_ATTR_UIDGID |
| | SSH_FILEXFER_ATTR_ACMODTIME; |
| |
| attr.permissions = Integer.decode(args[0]); |
| attr.size = Long.parseLong(args[1]); |
| attr.uid = Integer.parseInt(args[2]); |
| attr.gid = Integer.parseInt(args[3]); |
| attr.mtime = Integer.parseInt(args[4]); |
| attr.atime = Integer.parseInt(args[5]); |
| return attr; |
| } |
| |
| int length() { |
| int len = 4; |
| |
| if ((flags & SSH_FILEXFER_ATTR_SIZE) != 0) { |
| len += 8; |
| } |
| if ((flags & SSH_FILEXFER_ATTR_UIDGID) != 0) { |
| len += 8; |
| } |
| if ((flags & SSH_FILEXFER_ATTR_PERMISSIONS) != 0) { |
| len += 4; |
| } |
| if ((flags & SSH_FILEXFER_ATTR_ACMODTIME) != 0) { |
| len += 8; |
| } |
| if ((flags & SSH_FILEXFER_ATTR_EXTENDED) != 0) { |
| len += 4; |
| int count = extended.length / 2; |
| if (count > 0) { |
| for (int i = 0; i < count; i++) { |
| len += 4; |
| len += extended[i * 2].length(); |
| len += 4; |
| len += extended[i * 2 + 1].length(); |
| } |
| } |
| } |
| return len; |
| } |
| |
| void dump(Buffer buf) { |
| buf.putInt(flags); |
| if ((flags & SSH_FILEXFER_ATTR_SIZE) != 0) { |
| buf.putLong(size); |
| } |
| if ((flags & SSH_FILEXFER_ATTR_UIDGID) != 0) { |
| buf.putInt(uid); |
| buf.putInt(gid); |
| } |
| if ((flags & SSH_FILEXFER_ATTR_PERMISSIONS) != 0) { |
| buf.putInt(permissions); |
| } |
| if ((flags & SSH_FILEXFER_ATTR_ACMODTIME) != 0) { |
| buf.putInt(atime); |
| } |
| if ((flags & SSH_FILEXFER_ATTR_ACMODTIME) != 0) { |
| buf.putInt(mtime); |
| } |
| if ((flags & SSH_FILEXFER_ATTR_EXTENDED) != 0) { |
| int count = extended.length / 2; |
| if (count > 0) { |
| for (int i = 0; i < count; i++) { |
| buf.putString(extended[i * 2].getBytes()); |
| buf.putString(extended[i * 2 + 1].getBytes()); |
| } |
| } |
| } |
| } |
| |
| void setFLAGS(int flags) { |
| this.flags = flags; |
| } |
| |
| public void setSIZE(long size) { |
| flags |= SSH_FILEXFER_ATTR_SIZE; |
| this.size = size; |
| } |
| |
| public void setUIDGID(int uid, int gid) { |
| flags |= SSH_FILEXFER_ATTR_UIDGID; |
| this.uid = uid; |
| this.gid = gid; |
| } |
| |
| public void setACMODTIME(int atime, int mtime) { |
| flags |= SSH_FILEXFER_ATTR_ACMODTIME; |
| this.atime = atime; |
| this.mtime = mtime; |
| } |
| |
| public void setPERMISSIONS(int permissions) { |
| flags |= SSH_FILEXFER_ATTR_PERMISSIONS; |
| permissions = (this.permissions & ~pmask) | (permissions & pmask); |
| this.permissions = permissions; |
| } |
| |
| public boolean isDir() { |
| return ((flags & SSH_FILEXFER_ATTR_PERMISSIONS) != 0 && ((permissions & S_IFDIR) == S_IFDIR)); |
| } |
| |
| public boolean isLink() { |
| return ((flags & SSH_FILEXFER_ATTR_PERMISSIONS) != 0 && ((permissions & S_IFLNK) == S_IFLNK)); |
| } |
| |
| public int getFlags() { |
| return flags; |
| } |
| |
| public long getSize() { |
| return size; |
| } |
| |
| public int getUId() { |
| return uid; |
| } |
| |
| public int getGId() { |
| return gid; |
| } |
| |
| public int getPermissions() { |
| return permissions; |
| } |
| |
| public int getATime() { |
| return atime; |
| } |
| |
| public int getMTime() { |
| return mtime; |
| } |
| |
| public String[] getExtended() { |
| return extended; |
| } |
| |
| @Override |
| public String toString() { |
| return getPermissionsString() + " " + getUId() + " " + getGId() + " " + getSize() + " " + getMtimeString(); //$NON-NLS-1$ //$NON-NLS-2$//$NON-NLS-3$//$NON-NLS-4$ |
| } |
| } |