OSDN Git Service

Fix bugs of simultaneous connection.
[ffftp/ffftp.git] / putty / SFTP.H
1 /*\r
2  * sftp.h: definitions for SFTP and the sftp.c routines.\r
3  */\r
4 \r
5 #include "int64.h"\r
6 \r
7 #define SSH_FXP_INIT                              1     /* 0x1 */\r
8 #define SSH_FXP_VERSION                           2     /* 0x2 */\r
9 #define SSH_FXP_OPEN                              3     /* 0x3 */\r
10 #define SSH_FXP_CLOSE                             4     /* 0x4 */\r
11 #define SSH_FXP_READ                              5     /* 0x5 */\r
12 #define SSH_FXP_WRITE                             6     /* 0x6 */\r
13 #define SSH_FXP_LSTAT                             7     /* 0x7 */\r
14 #define SSH_FXP_FSTAT                             8     /* 0x8 */\r
15 #define SSH_FXP_SETSTAT                           9     /* 0x9 */\r
16 #define SSH_FXP_FSETSTAT                          10    /* 0xa */\r
17 #define SSH_FXP_OPENDIR                           11    /* 0xb */\r
18 #define SSH_FXP_READDIR                           12    /* 0xc */\r
19 #define SSH_FXP_REMOVE                            13    /* 0xd */\r
20 #define SSH_FXP_MKDIR                             14    /* 0xe */\r
21 #define SSH_FXP_RMDIR                             15    /* 0xf */\r
22 #define SSH_FXP_REALPATH                          16    /* 0x10 */\r
23 #define SSH_FXP_STAT                              17    /* 0x11 */\r
24 #define SSH_FXP_RENAME                            18    /* 0x12 */\r
25 #define SSH_FXP_STATUS                            101   /* 0x65 */\r
26 #define SSH_FXP_HANDLE                            102   /* 0x66 */\r
27 #define SSH_FXP_DATA                              103   /* 0x67 */\r
28 #define SSH_FXP_NAME                              104   /* 0x68 */\r
29 #define SSH_FXP_ATTRS                             105   /* 0x69 */\r
30 #define SSH_FXP_EXTENDED                          200   /* 0xc8 */\r
31 #define SSH_FXP_EXTENDED_REPLY                    201   /* 0xc9 */\r
32 \r
33 #define SSH_FX_OK                                 0\r
34 #define SSH_FX_EOF                                1\r
35 #define SSH_FX_NO_SUCH_FILE                       2\r
36 #define SSH_FX_PERMISSION_DENIED                  3\r
37 #define SSH_FX_FAILURE                            4\r
38 #define SSH_FX_BAD_MESSAGE                        5\r
39 #define SSH_FX_NO_CONNECTION                      6\r
40 #define SSH_FX_CONNECTION_LOST                    7\r
41 #define SSH_FX_OP_UNSUPPORTED                     8\r
42 \r
43 #define SSH_FILEXFER_ATTR_SIZE                    0x00000001\r
44 #define SSH_FILEXFER_ATTR_UIDGID                  0x00000002\r
45 #define SSH_FILEXFER_ATTR_PERMISSIONS             0x00000004\r
46 #define SSH_FILEXFER_ATTR_ACMODTIME               0x00000008\r
47 #define SSH_FILEXFER_ATTR_EXTENDED                0x80000000\r
48 \r
49 #define SSH_FXF_READ                              0x00000001\r
50 #define SSH_FXF_WRITE                             0x00000002\r
51 #define SSH_FXF_APPEND                            0x00000004\r
52 #define SSH_FXF_CREAT                             0x00000008\r
53 #define SSH_FXF_TRUNC                             0x00000010\r
54 #define SSH_FXF_EXCL                              0x00000020\r
55 \r
56 #define SFTP_PROTO_VERSION 3\r
57 \r
58 /*\r
59  * External references. The sftp client module sftp.c expects to be\r
60  * able to get at these functions.\r
61  * \r
62  * sftp_recvdata must never return less than len. It either blocks\r
63  * until len is available, or it returns failure.\r
64  * \r
65  * Both functions return 1 on success, 0 on failure.\r
66  */\r
67 int sftp_senddata(char *data, int len);\r
68 int sftp_recvdata(char *data, int len);\r
69 \r
70 /*\r
71  * Free sftp_requests\r
72  */\r
73 void sftp_cleanup_request(void);\r
74 \r
75 struct fxp_attrs {\r
76     unsigned long flags;\r
77     uint64 size;\r
78     unsigned long uid;\r
79     unsigned long gid;\r
80     unsigned long permissions;\r
81     unsigned long atime;\r
82     unsigned long mtime;\r
83 };\r
84 \r
85 struct fxp_handle {\r
86     char *hstring;\r
87     int hlen;\r
88 };\r
89 \r
90 struct fxp_name {\r
91     char *filename, *longname;\r
92     struct fxp_attrs attrs;\r
93 };\r
94 \r
95 struct fxp_names {\r
96     int nnames;\r
97     struct fxp_name *names;\r
98 };\r
99 \r
100 struct sftp_request;\r
101 struct sftp_packet;\r
102 \r
103 const char *fxp_error(void);\r
104 int fxp_error_type(void);\r
105 \r
106 /*\r
107  * Perform exchange of init/version packets. Return 0 on failure.\r
108  */\r
109 int fxp_init(void);\r
110 \r
111 /*\r
112  * Canonify a pathname. Concatenate the two given path elements\r
113  * with a separating slash, unless the second is NULL.\r
114  */\r
115 struct sftp_request *fxp_realpath_send(char *path);\r
116 char *fxp_realpath_recv(struct sftp_packet *pktin, struct sftp_request *req);\r
117 \r
118 /*\r
119  * Open a file.\r
120  */\r
121 struct sftp_request *fxp_open_send(char *path, int type);\r
122 struct fxp_handle *fxp_open_recv(struct sftp_packet *pktin,\r
123                                  struct sftp_request *req);\r
124 \r
125 /*\r
126  * Open a directory.\r
127  */\r
128 struct sftp_request *fxp_opendir_send(char *path);\r
129 struct fxp_handle *fxp_opendir_recv(struct sftp_packet *pktin,\r
130                                     struct sftp_request *req);\r
131 \r
132 /*\r
133  * Close a file/dir.\r
134  */\r
135 struct sftp_request *fxp_close_send(struct fxp_handle *handle);\r
136 void fxp_close_recv(struct sftp_packet *pktin, struct sftp_request *req);\r
137 \r
138 /*\r
139  * Make a directory.\r
140  */\r
141 struct sftp_request *fxp_mkdir_send(char *path);\r
142 int fxp_mkdir_recv(struct sftp_packet *pktin, struct sftp_request *req);\r
143 \r
144 /*\r
145  * Remove a directory.\r
146  */\r
147 struct sftp_request *fxp_rmdir_send(char *path);\r
148 int fxp_rmdir_recv(struct sftp_packet *pktin, struct sftp_request *req);\r
149 \r
150 /*\r
151  * Remove a file.\r
152  */\r
153 struct sftp_request *fxp_remove_send(char *fname);\r
154 int fxp_remove_recv(struct sftp_packet *pktin, struct sftp_request *req);\r
155 \r
156 /*\r
157  * Rename a file.\r
158  */\r
159 struct sftp_request *fxp_rename_send(char *srcfname, char *dstfname);\r
160 int fxp_rename_recv(struct sftp_packet *pktin, struct sftp_request *req);\r
161 \r
162 /*\r
163  * Return file attributes.\r
164  */\r
165 struct sftp_request *fxp_stat_send(char *fname);\r
166 int fxp_stat_recv(struct sftp_packet *pktin, struct sftp_request *req,\r
167                   struct fxp_attrs *attrs);\r
168 struct sftp_request *fxp_fstat_send(struct fxp_handle *handle);\r
169 int fxp_fstat_recv(struct sftp_packet *pktin, struct sftp_request *req,\r
170                    struct fxp_attrs *attrs);\r
171 \r
172 /*\r
173  * Set file attributes.\r
174  */\r
175 struct sftp_request *fxp_setstat_send(char *fname, struct fxp_attrs attrs);\r
176 int fxp_setstat_recv(struct sftp_packet *pktin, struct sftp_request *req);\r
177 struct sftp_request *fxp_fsetstat_send(struct fxp_handle *handle,\r
178                                        struct fxp_attrs attrs);\r
179 int fxp_fsetstat_recv(struct sftp_packet *pktin, struct sftp_request *req);\r
180 \r
181 /*\r
182  * Read from a file.\r
183  */\r
184 struct sftp_request *fxp_read_send(struct fxp_handle *handle,\r
185                                    uint64 offset, int len);\r
186 int fxp_read_recv(struct sftp_packet *pktin, struct sftp_request *req,\r
187                   char *buffer, int len);\r
188 \r
189 /*\r
190  * Write to a file. Returns 0 on error, 1 on OK.\r
191  */\r
192 struct sftp_request *fxp_write_send(struct fxp_handle *handle,\r
193                                     char *buffer, uint64 offset, int len);\r
194 int fxp_write_recv(struct sftp_packet *pktin, struct sftp_request *req);\r
195 \r
196 /*\r
197  * Read from a directory.\r
198  */\r
199 struct sftp_request *fxp_readdir_send(struct fxp_handle *handle);\r
200 struct fxp_names *fxp_readdir_recv(struct sftp_packet *pktin,\r
201                                    struct sftp_request *req);\r
202 \r
203 /*\r
204  * Free up an fxp_names structure.\r
205  */\r
206 void fxp_free_names(struct fxp_names *names);\r
207 \r
208 /*\r
209  * Duplicate and free fxp_name structures.\r
210  */\r
211 struct fxp_name *fxp_dup_name(struct fxp_name *name);\r
212 void fxp_free_name(struct fxp_name *name);\r
213 \r
214 /*\r
215  * Store user data in an sftp_request structure.\r
216  */\r
217 void *fxp_get_userdata(struct sftp_request *req);\r
218 void fxp_set_userdata(struct sftp_request *req, void *data);\r
219 \r
220 /*\r
221  * These functions might well be temporary placeholders to be\r
222  * replaced with more useful similar functions later. They form the\r
223  * main dispatch loop for processing incoming SFTP responses.\r
224  */\r
225 void sftp_register(struct sftp_request *req);\r
226 struct sftp_request *sftp_find_request(struct sftp_packet *pktin);\r
227 struct sftp_packet *sftp_recv(void);\r
228 \r
229 /*\r
230  * A wrapper to go round fxp_read_* and fxp_write_*, which manages\r
231  * the queueing of multiple read/write requests.\r
232  */\r
233 \r
234 struct fxp_xfer;\r
235 \r
236 struct fxp_xfer *xfer_download_init(struct fxp_handle *fh, uint64 offset);\r
237 void xfer_download_queue(struct fxp_xfer *xfer);\r
238 int xfer_download_gotpkt(struct fxp_xfer *xfer, struct sftp_packet *pktin);\r
239 int xfer_download_data(struct fxp_xfer *xfer, void **buf, int *len);\r
240 \r
241 struct fxp_xfer *xfer_upload_init(struct fxp_handle *fh, uint64 offset);\r
242 int xfer_upload_ready(struct fxp_xfer *xfer);\r
243 void xfer_upload_data(struct fxp_xfer *xfer, char *buffer, int len);\r
244 int xfer_upload_gotpkt(struct fxp_xfer *xfer, struct sftp_packet *pktin);\r
245 \r
246 int xfer_done(struct fxp_xfer *xfer);\r
247 void xfer_set_error(struct fxp_xfer *xfer);\r
248 void xfer_cleanup(struct fxp_xfer *xfer);\r