00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00039 #ifndef SFTP_H
00040 #define SFTP_H
00041 #include <libssh/libssh.h>
00042 #ifdef __cplusplus
00043 extern "C" {
00044 #endif
00045
00046 #ifdef __GNUC__
00047 #define SFTP_DEPRECATED __attribute__ ((deprecated))
00048 #else
00049 #define SFTP_DEPRECATED
00050 #endif
00051
00052 #ifdef _WIN32
00053 #ifndef uid_t
00054 typedef long uid_t;
00055 #endif
00056 #ifndef gid_t
00057 typedef long gid_t;
00058 #endif
00059 #endif
00060
00061 typedef struct sftp_session_struct {
00062 SSH_SESSION *session;
00063 CHANNEL *channel;
00064 int server_version;
00065 int client_version;
00066 int version;
00067 struct request_queue *queue;
00068 u32 id_counter;
00069 int errnum;
00070 void **handles;
00071 } SFTP_SESSION ;
00072
00073 typedef struct {
00074 SFTP_SESSION *sftp;
00075 u8 type;
00076 BUFFER *payload;
00077 } SFTP_PACKET;
00078
00079
00080 typedef struct sftp_file{
00081 SFTP_SESSION *sftp;
00082 char *name;
00083 u64 offset;
00084 STRING *handle;
00085 int eof;
00086 int nonblocking;
00087 } SFTP_FILE ;
00088
00089 typedef struct sftp_dir {
00090 SFTP_SESSION *sftp;
00091 char *name;
00092 STRING *handle;
00093 BUFFER *buffer;
00094 u32 count;
00095 int eof;
00096 } SFTP_DIR;
00097
00098 typedef struct {
00099 SFTP_SESSION *sftp;
00100 u8 packet_type;
00101 BUFFER *payload;
00102 u32 id;
00103 } SFTP_MESSAGE;
00104
00105
00106 typedef struct sftp_client_message{
00107 SFTP_SESSION *sftp;
00108 u8 type;
00109 u32 id;
00110 char *filename;
00111 u32 flags;
00112 struct sftp_attributes *attr;
00113 STRING *handle;
00114 u64 offset;
00115 u32 len;
00116 int attr_num;
00117 BUFFER *attrbuf;
00118 STRING *data;
00119 } SFTP_CLIENT_MESSAGE;
00120
00121 typedef struct request_queue{
00122 struct request_queue *next;
00123 SFTP_MESSAGE *message;
00124 } REQUEST_QUEUE;
00125
00126
00127 typedef struct {
00128 u32 id;
00129 u32 status;
00130 STRING *error;
00131 STRING *lang;
00132 char *errormsg;
00133 char *langmsg;
00134 } STATUS_MESSAGE;
00135
00136
00137 typedef struct sftp_attributes{
00138 char *name;
00139 char *longname;
00140 u32 flags;
00141 u8 type;
00142 u64 size;
00143 u32 uid;
00144 u32 gid;
00145 char *owner;
00146 char *group;
00147 u32 permissions;
00148 u64 atime64;
00149 u32 atime;
00150 u32 atime_nseconds;
00151 u64 createtime;
00152 u32 createtime_nseconds;
00153 u64 mtime64;
00154 u32 mtime;
00155 u32 mtime_nseconds;
00156 STRING *acl;
00157 u32 extended_count;
00158 STRING *extended_type;
00159 STRING *extended_data;
00160 } SFTP_ATTRIBUTES;
00161
00162 #define LIBSFTP_VERSION 3
00163
00171 SFTP_SESSION *sftp_new(SSH_SESSION *session);
00172
00178 void sftp_free(SFTP_SESSION *sftp);
00179
00187 int sftp_init(SFTP_SESSION *sftp);
00188
00199 int sftp_get_error(SFTP_SESSION *sftp);
00200
00213 SFTP_DIR *sftp_opendir(SFTP_SESSION *session, const char *path);
00214
00228 SFTP_ATTRIBUTES *sftp_readdir(SFTP_SESSION *session, SFTP_DIR *dir);
00229
00239 int sftp_dir_eof(SFTP_DIR *dir);
00240
00251 SFTP_ATTRIBUTES *sftp_stat(SFTP_SESSION *session, const char *path);
00252
00266 SFTP_ATTRIBUTES *sftp_lstat(SFTP_SESSION *session, const char *path);
00267
00276 SFTP_ATTRIBUTES *sftp_fstat(SFTP_FILE *file);
00277
00283 void sftp_attributes_free(SFTP_ATTRIBUTES *file);
00284
00292 int sftp_closedir(SFTP_DIR *dir);
00293
00297 int sftp_dir_close(SFTP_DIR *dir) SFTP_DEPRECATED;
00298
00308 int sftp_close(SFTP_FILE *file);
00309
00313 int sftp_file_close(SFTP_FILE *file) SFTP_DEPRECATED;
00314
00341 SFTP_FILE *sftp_open(SFTP_SESSION *session, const char *file, int flags,
00342 mode_t mode);
00343
00344 void sftp_file_set_nonblocking(SFTP_FILE *handle);
00345
00346 void sftp_file_set_blocking(SFTP_FILE *handle);
00347
00360 ssize_t sftp_read(SFTP_FILE *file, void *buf, size_t count);
00361
00393 int sftp_async_read_begin(SFTP_FILE *file, u32 len);
00394
00418 int sftp_async_read(SFTP_FILE *file, void *data, u32 len, u32 id);
00419
00436 ssize_t sftp_write(SFTP_FILE *file, const void *buf, size_t count);
00437
00447 int sftp_seek(SFTP_FILE *file, u32 new_offset);
00448
00459 int sftp_seek64(SFTP_FILE *file, u64 new_offset);
00460
00470 unsigned long sftp_tell(SFTP_FILE *file);
00471
00481 u64 sftp_tell64(SFTP_FILE *file);
00482
00489 void sftp_rewind(SFTP_FILE *file);
00490
00494 int sftp_rm(SFTP_SESSION *sftp, const char *file) SFTP_DEPRECATED;
00495
00505 int sftp_unlink(SFTP_SESSION *sftp, const char *file);
00506
00516 int sftp_rmdir(SFTP_SESSION *sftp, const char *directory);
00517
00531 int sftp_mkdir(SFTP_SESSION *sftp, const char *directory, mode_t mode);
00532
00546 int sftp_rename(SFTP_SESSION *sftp, const char *original, const char *newname);
00547
00560 int sftp_setstat(SFTP_SESSION *sftp, const char *file, SFTP_ATTRIBUTES *attr);
00561
00575 int sftp_chown(SFTP_SESSION *sftp, const char *file, uid_t owner, gid_t group);
00576
00590 int sftp_chmod(SFTP_SESSION *sftp, const char *file, mode_t mode);
00591
00604 int sftp_utimes(SFTP_SESSION *sftp, const char *file, const struct timeval *times);
00605
00617 int sftp_symlink(SFTP_SESSION *sftp, const char *target, const char *dest);
00618
00628 char *sftp_readlink(SFTP_SESSION *sftp, const char *path);
00629
00639 char *sftp_canonicalize_path(SFTP_SESSION *sftp, const char *path);
00640
00648 int sftp_server_version(SFTP_SESSION *sftp);
00649
00650 #ifdef WITH_SERVER
00651
00660 SFTP_SESSION *sftp_server_new(SSH_SESSION *session, CHANNEL *chan);
00661
00669 int sftp_server_init(SFTP_SESSION *sftp);
00670 #endif
00671
00672
00673 #define SFTP_HANDLES 256
00674 SFTP_PACKET *sftp_packet_read(SFTP_SESSION *sftp);
00675 int sftp_packet_write(SFTP_SESSION *sftp,u8 type, BUFFER *payload);
00676 void sftp_packet_free(SFTP_PACKET *packet);
00677 int buffer_add_attributes(BUFFER *buffer, SFTP_ATTRIBUTES *attr);
00678 SFTP_ATTRIBUTES *sftp_parse_attr(SFTP_SESSION *session, BUFFER *buf,int expectname);
00679
00680
00681 SFTP_CLIENT_MESSAGE *sftp_get_client_message(SFTP_SESSION *sftp);
00682 void sftp_client_message_free(SFTP_CLIENT_MESSAGE *msg);
00683 int sftp_reply_name(SFTP_CLIENT_MESSAGE *msg, const char *name,
00684 SFTP_ATTRIBUTES *attr);
00685 int sftp_reply_handle(SFTP_CLIENT_MESSAGE *msg, STRING *handle);
00686 STRING *sftp_handle_alloc(SFTP_SESSION *sftp, void *info);
00687 int sftp_reply_attr(SFTP_CLIENT_MESSAGE *msg, SFTP_ATTRIBUTES *attr);
00688 void *sftp_handle(SFTP_SESSION *sftp, STRING *handle);
00689 int sftp_reply_status(SFTP_CLIENT_MESSAGE *msg, u32 status, const char *message);
00690 int sftp_reply_names_add(SFTP_CLIENT_MESSAGE *msg, const char *file,
00691 const char *longname, SFTP_ATTRIBUTES *attr);
00692 int sftp_reply_names(SFTP_CLIENT_MESSAGE *msg);
00693 int sftp_reply_data(SFTP_CLIENT_MESSAGE *msg, const void *data, int len);
00694 void sftp_handle_remove(SFTP_SESSION *sftp, void *handle);
00695
00696
00697 #define SSH_FXP_INIT 1
00698 #define SSH_FXP_VERSION 2
00699 #define SSH_FXP_OPEN 3
00700 #define SSH_FXP_CLOSE 4
00701 #define SSH_FXP_READ 5
00702 #define SSH_FXP_WRITE 6
00703 #define SSH_FXP_LSTAT 7
00704 #define SSH_FXP_FSTAT 8
00705 #define SSH_FXP_SETSTAT 9
00706 #define SSH_FXP_FSETSTAT 10
00707 #define SSH_FXP_OPENDIR 11
00708 #define SSH_FXP_READDIR 12
00709 #define SSH_FXP_REMOVE 13
00710 #define SSH_FXP_MKDIR 14
00711 #define SSH_FXP_RMDIR 15
00712 #define SSH_FXP_REALPATH 16
00713 #define SSH_FXP_STAT 17
00714 #define SSH_FXP_RENAME 18
00715 #define SSH_FXP_READLINK 19
00716 #define SSH_FXP_SYMLINK 20
00717
00718 #define SSH_FXP_STATUS 101
00719 #define SSH_FXP_HANDLE 102
00720 #define SSH_FXP_DATA 103
00721 #define SSH_FXP_NAME 104
00722 #define SSH_FXP_ATTRS 105
00723
00724 #define SSH_FXP_EXTENDED 200
00725 #define SSH_FXP_EXTENDED_REPLY 201
00726
00727
00728
00729
00730
00731
00732 #define SSH_FILEXFER_ATTR_SIZE 0x00000001
00733 #define SSH_FILEXFER_ATTR_PERMISSIONS 0x00000004
00734 #define SSH_FILEXFER_ATTR_ACCESSTIME 0x00000008
00735 #define SSH_FILEXFER_ATTR_ACMODTIME 0x00000008
00736 #define SSH_FILEXFER_ATTR_CREATETIME 0x00000010
00737 #define SSH_FILEXFER_ATTR_MODIFYTIME 0x00000020
00738 #define SSH_FILEXFER_ATTR_ACL 0x00000040
00739 #define SSH_FILEXFER_ATTR_OWNERGROUP 0x00000080
00740 #define SSH_FILEXFER_ATTR_SUBSECOND_TIMES 0x00000100
00741 #define SSH_FILEXFER_ATTR_EXTENDED 0x80000000
00742 #define SSH_FILEXFER_ATTR_UIDGID 0x00000002
00743
00744
00745 #define SSH_FILEXFER_TYPE_REGULAR 1
00746 #define SSH_FILEXFER_TYPE_DIRECTORY 2
00747 #define SSH_FILEXFER_TYPE_SYMLINK 3
00748 #define SSH_FILEXFER_TYPE_SPECIAL 4
00749 #define SSH_FILEXFER_TYPE_UNKNOWN 5
00750
00751
00752 #define SSH_FX_OK 0
00753 #define SSH_FX_EOF 1
00754 #define SSH_FX_NO_SUCH_FILE 2
00755 #define SSH_FX_PERMISSION_DENIED 3
00756 #define SSH_FX_FAILURE 4
00757 #define SSH_FX_BAD_MESSAGE 5
00758 #define SSH_FX_NO_CONNECTION 6
00759 #define SSH_FX_CONNECTION_LOST 7
00760 #define SSH_FX_OP_UNSUPPORTED 8
00761 #define SSH_FX_INVALID_HANDLE 9
00762 #define SSH_FX_NO_SUCH_PATH 10
00763 #define SSH_FX_FILE_ALREADY_EXISTS 11
00764 #define SSH_FX_WRITE_PROTECT 12
00765 #define SSH_FX_NO_MEDIA 13
00766
00767
00768 #define SSH_FXF_READ 0x01
00769 #define SSH_FXF_WRITE 0x02
00770 #define SSH_FXF_APPEND 0x04
00771 #define SSH_FXF_CREAT 0x08
00772 #define SSH_FXF_TRUNC 0x10
00773 #define SSH_FXF_EXCL 0x20
00774 #define SSH_FXF_TEXT 0x40
00775
00776
00777 #define SSH_FXF_RENAME_OVERWRITE 0x00000001
00778 #define SSH_FXF_RENAME_ATOMIC 0x00000002
00779 #define SSH_FXF_RENAME_NATIVE 0x00000004
00780
00781 #define SFTP_OPEN SSH_FXP_OPEN
00782 #define SFTP_CLOSE SSH_FXP_CLOSE
00783 #define SFTP_READ SSH_FXP_READ
00784 #define SFTP_WRITE SSH_FXP_WRITE
00785 #define SFTP_LSTAT SSH_FXP_LSTAT
00786 #define SFTP_FSTAT SSH_FXP_FSTAT
00787 #define SFTP_SETSTAT SSH_FXP_SETSTAT
00788 #define SFTP_FSETSTAT SSH_FXP_FSETSTAT
00789 #define SFTP_OPENDIR SSH_FXP_OPENDIR
00790 #define SFTP_READDIR SSH_FXP_READDIR
00791 #define SFTP_REMOVE SSH_FXP_REMOVE
00792 #define SFTP_MKDIR SSH_FXP_MKDIR
00793 #define SFTP_RMDIR SSH_FXP_RMDIR
00794 #define SFTP_REALPATH SSH_FXP_REALPATH
00795 #define SFTP_STAT SSH_FXP_STAT
00796 #define SFTP_RENAME SSH_FXP_RENAME
00797 #define SFTP_READLINK SSH_FXP_READLINK
00798 #define SFTP_SYMLINK SSH_FXP_SYMLINK
00799
00800
00801
00802 #ifdef __cplusplus
00803 } ;
00804 #endif
00805
00806 #endif
00807
00809