1 /*
2 
3   silcsftp.h
4 
5   Author: Pekka Riikonen <priikone@silcnet.org>
6 
7   Copyright (C) 2001 - 2007 Pekka Riikonen
8 
9   The contents of this file are subject to one of the Licenses specified
10   in the COPYING file;  You may not use this file except in compliance
11   with the License.
12 
13   The software distributed under the License is distributed on an "AS IS"
14   basis, in the hope that it will be useful, but WITHOUT WARRANTY OF ANY
15   KIND, either expressed or implied.  See the COPYING file for more
16   information.
17 
18 */
19 
20 #ifndef SILCSFTP_H
21 #define SILCSFTP_H
22 
23 /****h* silcsftp/SILC SFTP Interface
24  *
25  * DESCRIPTION
26  *
27  * SILC SFTP Interface is the implementation of the Secure File Transfer
28  * Protocol (or SSH File Transfer Protocol).  The interface defines the SFTP
29  * client and the SFTP server.  The SFTP is the mandatory file transfer
30  * protocol in the SILC protocol, and when used in SILC the SFTP packets are
31  * encapsulated into SILC packets.  The SFTP server implementation is
32  * filesystem independent and generic interface is defined to represent
33  * filesystem access.
34  *
35  * The SilcSFTP context is the actual SFTP client or SFTP server, and each
36  * SFTP session should create its own SFTP context.
37  *
38  * The SILC SFTP library is a generic SFTP implementation and not directly
39  * related to either SILC or SSH.  It could be used for any general purpose
40  * SFTP application.
41  *
42  ***/
43 
44 /****s* silcsftp/SilcSFTPAPI/SilcSFTP
45  *
46  * NAME
47  *
48  *    typedef struct SilcSFTPStruct *SilcSFTP;
49  *
50  * DESCRIPTION
51  *
52  *    This context is the actual SFTP client and SFTP server, and is
53  *    allocated by silc_sftp_client_start or silc_sftp_server_start and
54  *    given as argument usually to all silc_sftp_* functions.  It is freed
55  *    by the silc_sftp_client_shutdown or silc_sftp_server_shutdown
56  *    functions.
57  *
58  ***/
59 typedef struct SilcSFTPStruct *SilcSFTP;
60 
61 /****d* silcsftp/SilcSFTPAPI/SilcSFTPVersion
62  *
63  * NAME
64  *
65  *    typedef SilcUInt32 SilcSFTPVersion;
66  *
67  * DESCRIPTION
68  *
69  *    SFTP Version type.
70  *
71  ***/
72 typedef SilcUInt32 SilcSFTPVersion;
73 
74 /* SFTP protocol version */
75 #define SILC_SFTP_PROTOCOL_VERSION       3
76 
77 /****d* silcsftp/SilcSFTPAPI/SilcSFTPStatus
78  *
79  * NAME
80  *
81  *    typedef enum { ... } SilcSFTPStatus
82  *
83  * DESCRIPTION
84  *
85  *    SFTP protocol status types.  These enumerations is used to indicate
86  *    the status of request.  The server can send these to the client when
87  *    client has requested an operation.
88  *
89  * SOURCE
90  */
91 typedef enum {
92   SILC_SFTP_STATUS_OK                  = 0,  /* Operation successful */
93   SILC_SFTP_STATUS_EOF                 = 1,  /* No more data available */
94   SILC_SFTP_STATUS_NO_SUCH_FILE        = 2,  /* File does not exist */
95   SILC_SFTP_STATUS_PERMISSION_DENIED   = 3,  /* No sufficient permissions */
96   SILC_SFTP_STATUS_FAILURE             = 4,  /* Operation failed */
97   SILC_SFTP_STATUS_BAD_MESSAGE         = 5,  /* Bad message received */
98   SILC_SFTP_STATUS_NO_CONNECTION       = 6,  /* No connection to remote */
99   SILC_SFTP_STATUS_CONNECTION_LOST     = 7,  /* Connection lost to server */
100   SILC_SFTP_STATUS_OP_UNSUPPORTED      = 8,  /* Operation unsupported */
101   SILC_SFTP_STATUS_INVALID_HANDLE      = 9,  /* Invalid file handle */
102   SILC_SFTP_STATUS_NO_SUCH_PATH        = 10, /* Path does not exist */
103   SILC_SFTP_STATUS_FILE_ALREADY_EXIST  = 11, /* File already exists */
104   SILC_SFTP_STATUS_WRITE_PROTECT       = 12, /* Read-only or protected */
105   SILC_SFTP_STATUS_NO_MEDIA            = 13, /* No media available */
106   SILC_SFTP_STATUS_NO_SPACE_ON_DEVICE  = 14, /* No space on device */
107   SILC_SFTP_STATUS_QUOTA_EXCEEDED      = 15, /* Quota limit reached */
108   SILC_SFTP_STATUS_UNKNOWN_PRINCIBLE   = 16, /* Unknown princible */
109   SILC_SFTP_STATUS_LOCK_CONFLICT       = 17, /* File already locked */
110   SILC_SFTP_STATUS_NOT_EMPTY           = 18, /* Directory not empty */
111   SILC_SFTP_STATUS_NOT_A_DIRECTORY     = 19, /* Not a directory */
112   SILC_SFTP_STATUS_INVALID_FILENAME    = 20, /* Invalid filename */
113   SILC_SFTP_STATUS_LINK_LOOP           = 21, /* Too many symlinks */
114   SILC_SFTP_STATUS_CANNOT_DELETE       = 22, /* Could not delete file */
115   SILC_SFTP_STATUS_INVALID_PARAMETER   = 23, /* Invalid parameter */
116   SILC_SFTP_STATUS_FILE_IS_A_DIRECTORY = 24, /* File is a directory file */
117   SILC_SFTP_STATUS_BR_LOCK_CONFLICT    = 25, /* Byte range lock conflict */
118   SILC_SFTP_STATUS_BR_LOCK_REFUSED     = 26, /* Byte range lock refused */
119   SILC_SFTP_STATUS_DELETE_PENDING      = 27, /* File is being deleted */
120   SILC_SFTP_STATUS_FILE_CORRUPT        = 28, /* File is corrupted */
121 } SilcSFTPStatus;
122 /***/
123 
124 /****d* silcsftp/SilcSFTPAPI/SilcSFTPFileOperation
125  *
126  * NAME
127  *
128  *    typedef enum { ... } SilcSFTPFileOperation
129  *
130  * DESCRIPTION
131  *
132  *    SFTP protocol file operation flags.  These enumerations can be used
133  *    by the client when client is opening an file, to indicate how it
134  *    would like to open the file.
135  *
136  * SOURCE
137  */
138 typedef enum {
139   SILC_SFTP_FXF_READ           = 0x00000001, /* Reading */
140   SILC_SFTP_FXF_WRITE          = 0x00000002, /* Writing */
141   SILC_SFTP_FXF_APPEND         = 0x00000004, /* Appending to end of file */
142   SILC_SFTP_FXF_CREAT          = 0x00000008, /* Create if doesn't exist */
143   SILC_SFTP_FXF_TRUNC          = 0x00000010, /* Truncate if exists */
144   SILC_SFTP_FXF_EXCL           = 0x00000020, /* Don't create if exists */
145 } SilcSFTPFileOperation;
146 /***/
147 
148 /****s* silcsftp/SilcSFTPAPI/SilcSFTPAttributes
149  *
150  * NAME
151  *
152  *    typedef struct { ... } *SilcSFTPAttributes, SilcSFTPAttributesStruct;
153  *
154  * DESCRIPTION
155  *
156  *    SFTP File attributes structure represents the attributes for a file.
157  *    This structure can be used by the client to send attributes to the
158  *    server, and by server to return file attributes to the client.
159  *
160  ***/
161 typedef struct SilcSFTPAttributesObject {
162   SilcUInt32 flags;	       	/* Flags to indicate present attributes */
163   SilcUInt64 size;	       	/* Sife of the file in bytes */
164   SilcUInt32 uid;      	        /* Unix user ID */
165   SilcUInt32 gid;      		/* Unix group ID */
166   SilcUInt32 permissions;      	/* POSIX file permission bitmask */
167   SilcUInt32 atime;    		/* Access time of file */
168   SilcUInt32 mtime;	       	/* Modification time of file */
169 
170   SilcUInt32 extended_count;	/* Extended type and data count */
171   SilcBuffer *extended_type;
172   SilcBuffer *extended_data;
173 } *SilcSFTPAttributes, SilcSFTPAttributesStruct;
174 
175 /****s* silcsftp/SilcSFTPAPI/SilcSFTPName
176  *
177  * NAME
178  *
179  *    typedef struct { ... } *SilcSFTPName, SilcSFTPNameStruct
180  *
181  * DESCRIPTION
182  *
183  *    SFTP Name structure represents the name reply received from the server.
184  *    It includes the returned file(s) short and long file names and
185  *    attributes for the file(s).  This is returned by the server for
186  *    example when reading the contents of a directory.
187  *
188  ***/
189 typedef struct SilcSFTPNameObject {
190   char **filename;
191   char **long_filename;
192   SilcSFTPAttributes *attrs;
193   SilcUInt32 count;			/* Number of files */
194 } *SilcSFTPName, SilcSFTPNameStruct;
195 
196 /****s* silcsftp/SilcSFTPAPI/SilcSFTPHandle
197  *
198  * NAME
199  *
200  *    typedef struct SilcSFTPHandleStruct *SilcSFTPHandle;
201  *
202  * DESCRIPTION
203  *
204  *    This context represents an open file handle and is allocated by
205  *    the library.  The application receives this context in the
206  *    SilcSFTPHandleCallback function.
207  *
208  ***/
209 typedef struct SilcSFTPHandleStruct *SilcSFTPHandle;
210 
211 /****f* silcsftp/SilcSFTPAPI/SilcSFTPVersionCallback
212  *
213  * SYNOPSIS
214  *
215  *    typedef void (*SilcSFTPVersionCallback)(SilcSFTP sftp,
216  *                                            SilcSFTPStatus status,
217  *                                            SilcSFTPVersion version,
218  *                                            void *context);
219  *
220  * DESCRIPTION
221  *
222  *    Version callback is called at the protocol initialization phase when
223  *    the server returns the version of the protocol. The `version' indicates
224  *    the version of the protocol.
225  *
226  ***/
227 typedef void (*SilcSFTPVersionCallback)(SilcSFTP sftp,
228 					SilcSFTPStatus status,
229 					SilcSFTPVersion version,
230 					void *context);
231 
232 /****f* silcsftp/SilcSFTPAPI/SilcSFTPErrorCallback
233  *
234  * SYNOPSIS
235  *
236  *    typedef void (*SilcSFTPErrorCallback)(SilcSFTP sftp,
237  *                                          SilcSFTPStatus status,
238  *                                          void *context);
239  *
240  * DESCRIPTION
241  *
242  *    Error callback is called if a connection error occurs during SFTP
243  *    session.  If the connection or stream is closed this callback is
244  *    called.  Other errors are delivered in other callbacks.  Only the
245  *    SILC_SFTP_STATUS_EOF or SILC_SFTP_STATUS_NO_CONNECTION is delivered
246  *    in this callback.
247  *
248  ***/
249 typedef void (*SilcSFTPErrorCallback)(SilcSFTP sftp,
250 				      SilcSFTPStatus status,
251 				      void *context);
252 
253 /****f* silcsftp/SilcSFTPAPI/SilcSFTPStatusCallback
254  *
255  * SYNOPSIS
256  *
257  *    typedef void (*SilcSFTPStatusCallback)(SilcSFTP sftp,
258  *                                           SilcSFTPStatus status,
259  *                                           const char *message,
260  *                                           const char *language_tag,
261  *                                           void *context);
262  *
263  * DESCRIPTION
264  *
265  *    Status callback is called every time server returns a status packet
266  *    for a request the client has made. The `status' indicates the type
267  *    of the status.  The `message' is optional error message received from
268  *    the server, in language indicated by the `language_tag'.  Both of
269  *    these pointers may be NULL.
270  *
271  ***/
272 typedef void (*SilcSFTPStatusCallback)(SilcSFTP sftp,
273 				       SilcSFTPStatus status,
274 				       const char *message,
275 				       const char *language_tag,
276 				       void *context);
277 
278 /****f* silcsftp/SilcSFTPAPI/SilcSFTPHandleCallback
279  *
280  * SYNOPSIS
281  *
282  *    typedef void (*SilcSFTPHandleCallback)(SilcSFTP sftp,
283  *                                           SilcSFTPStatus status,
284  *                                           SilcSFTPHandle handle,
285  *                                           void *context);
286  *
287  * DESCRIPTION
288  *
289  *    Handle callback is called when the server returns a handle to the
290  *    client as a result of some request client has made.  The `handle'
291  *    is the file handle and the application can use it to perform file
292  *    operations for the handle. Each of the returned handle must be
293  *    also closed at some point with silc_sftp_close.
294  *
295  ***/
296 typedef void (*SilcSFTPHandleCallback)(SilcSFTP sftp,
297 				       SilcSFTPStatus status,
298 				       SilcSFTPHandle handle,
299 				       void *context);
300 
301 /****f* silcsftp/SilcSFTPAPI/SilcSFTPDataCallback
302  *
303  * SYNOPSIS
304  *
305  *    typedef void (*SilcSFTPDataCallback)(SilcSFTP sftp,
306  *                                         SilcSFTPStatus status,
307  *                                         const unsigned char *data,
308  *                                         SilcUInt32 data_len,
309  *                                         void *context);
310  *
311  * DESCRIPTION
312  *
313  *    Data callback is called when data packet is received from the server.
314  *    This is called for example when application is reading a file from
315  *    the server.  The `data' is the raw data of length of `data_len'.
316  *
317  ***/
318 typedef void (*SilcSFTPDataCallback)(SilcSFTP sftp,
319 				     SilcSFTPStatus status,
320 				     const unsigned char *data,
321 				     SilcUInt32 data_len,
322 				     void *context);
323 
324 /****f* silcsftp/SilcSFTPAPI/SilcSFTPNameCallback
325  *
326  * SYNOPSIS
327  *
328  *    typedef void (*SilcSFTPNameCallback)(SilcSFTP sftp,
329  *                                         SilcSFTPStatus status,
330  *                                         const SilcSFTPName name,
331  *                                         void *context);
332  *
333  * DESCRIPTION
334  *
335  *    Name callback is called when directory is being read by the client.
336  *    The server returns one or more file names in one reply.  These file
337  *    names are saved in the `filename' structures with their short and
338  *    long name format, and with file attributes.
339  *
340  ***/
341 typedef void (*SilcSFTPNameCallback)(SilcSFTP sftp,
342 				     SilcSFTPStatus status,
343 				     const SilcSFTPName name,
344 				     void *context);
345 
346 /****f* silcsftp/SilcSFTPAPI/SilcSFTPAttrCallback
347  *
348  * SYNOPSIS
349  *
350  *    typedef void (*SilcSFTPAttrCallback)(SilcSFTP sftp,
351  *                                         SilcSFTPStatus status,
352  *                                         const SilcSFTPAttributes attrs,
353  *                                         void *context);
354  *
355  * DESCRIPTION
356  *
357  *    Attributes callback is called when the server returns the attributes
358  *    for a file the client has requested.  The attributes are saved in
359  *    the `attrs' structure.
360  *
361  ***/
362 typedef void (*SilcSFTPAttrCallback)(SilcSFTP sftp,
363 				     SilcSFTPStatus status,
364 				     const SilcSFTPAttributes attrs,
365 				     void *context);
366 
367 /****f* silcsftp/SilcSFTPAPI/SilcSFTPExtendedCallback
368  *
369  * SYNOPSIS
370  *
371  *    typedef void (*SilcSFTPExtendedCallback)(SilcSFTP sftp,
372  *                                             SilcSFTPStatus status,
373  *                                             const unsigned char *data,
374  *                                             SilcUInt32 data_len,
375  *                                             void *context);
376  *
377  * DESCRIPTION
378  *
379  *    Extended request callback is called when client sends extended
380  *    request to the server. The `data' is arbitrary data returned by the
381  *    server and its encoding is the extended request specific.
382  *
383  ***/
384 typedef void (*SilcSFTPExtendedCallback)(SilcSFTP sftp,
385 					 SilcSFTPStatus status,
386 					 const unsigned char *data,
387 					 SilcUInt32 data_len,
388 					 void *context);
389 
390 
391 /* SFTP Client Interface */
392 
393 /****f* silcsftp/SilcSFTPAPI/silc_sftp_client_start
394  *
395  * SYNOPSIS
396  *
397  *    SilcSFTP silc_sftp_client_start(SilcStream stream,
398  *                                    SilcSchedule schedule,
399  *                                    SilcSFTPVersionCallback version_cb,
400  *                                    SilcSFTPErrorCallback error_cb,
401  *                                    void *context);
402  *
403  * DESCRIPTION
404  *
405  *    Starts SFTP client and returns context to it.  The version callback
406  *    indicated by the `version_cb' will be called after the SFTP session has
407  *    been started and server has returned the version of the protocol.  The
408  *    SFTP client context is returned in the callback too.  This returns the
409  *    allocated SFTP client context or NULL on error.  The `stream' will be
410  *    used to read and write the SFTP packets.  The `error_cb' will be called
411  *    in case a stream error occurs, such as end of stream.
412  *
413  ***/
414 SilcSFTP silc_sftp_client_start(SilcStream stream,
415 				SilcSchedule schedule,
416 				SilcSFTPVersionCallback version_cb,
417 				SilcSFTPErrorCallback error_cb,
418 				void *context);
419 
420 /****f* silcsftp/SilcSFTPAPI/silc_sftp_client_shutdown
421  *
422  * SYNOPSIS
423  *
424  *    void silc_sftp_client_shutdown(SilcSFTP sftp);
425  *
426  * DESCRIPTION
427  *
428  *    Shutdown's the SFTP client.  The caller is responsible of closing
429  *    the associated stream.  The SFTP context is freed and is invalid after
430  *    this function returns.
431  *
432  ***/
433 void silc_sftp_client_shutdown(SilcSFTP sftp);
434 
435 /****f* silcsftp/SilcSFTPAPI/silc_sftp_open
436  *
437  * SYNOPSIS
438  *
439  *    void silc_sftp_open(SilcSFTP sftp,
440  *                        const char *filename,
441  *                        SilcSFTPFileOperation pflags,
442  *                        SilcSFTPAttributes attrs,
443  *                        SilcSFTPHandleCallback callback,
444  *                        void *context);
445  *
446  * DESCRIPTION
447  *
448  *    Open a file indicated by the `filename' with flags indicated by the
449  *    `pflags', and with attributes indicated by the `attsr'.  Calls the
450  *    `callback' to return the opened file handle.
451  *
452  ***/
453 void silc_sftp_open(SilcSFTP sftp,
454 		    const char *filename,
455 		    SilcSFTPFileOperation pflags,
456 		    SilcSFTPAttributes attrs,
457 		    SilcSFTPHandleCallback callback,
458 		    void *context);
459 
460 /****f* silcsftp/SilcSFTPAPI/silc_sftp_close
461  *
462  * SYNOPSIS
463  *
464  *    void silc_sftp_close(SilcSFTP sftp,
465  *                         SilcSFTPHandle handle,
466  *                         SilcSFTPStatusCallback callback,
467  *                         void *context);
468  *
469  * DESCRIPTION
470  *
471  *    Closes the file indicated by the file handle `handle'.  Calls the
472  *    `callback' to indicate the status of the closing.
473  *
474  ***/
475 void silc_sftp_close(SilcSFTP sftp,
476 		     SilcSFTPHandle handle,
477 		     SilcSFTPStatusCallback callback,
478 		     void *context);
479 
480 /****f* silcsftp/SilcSFTPAPI/silc_sftp_read
481  *
482  * SYNOPSIS
483  *
484  *    void silc_sftp_read(SilcSFTP sftp,
485  *                        SilcSFTPHandle handle,
486  *                        SilcUInt64 offset,
487  *                        SilcUInt32 len,
488  *                        SilcSFTPDataCallback callback,
489  *                        void *context);
490  *
491  * DESCRIPTION
492  *
493  *    Reads data from the file indicated by the file handle `handle' starting
494  *    from the offset of `offset' at most `len' bytes.  The `callback' is
495  *    called to return the read data.
496  *
497  ***/
498 void silc_sftp_read(SilcSFTP sftp,
499 		    SilcSFTPHandle handle,
500 		    SilcUInt64 offset,
501 		    SilcUInt32 len,
502 		    SilcSFTPDataCallback callback,
503 		    void *context);
504 
505 /****f* silcsftp/SilcSFTPAPI/silc_sftp_write
506  *
507  * SYNOPSIS
508  *
509  *    void silc_sftp_write(SilcSFTP sftp,
510  *                         SilcSFTPHandle handle,
511  *                         SilcUInt64 offset,
512  *                         const unsigned char *data,
513  *                         SilcUInt32 data_len,
514  *                         SilcSFTPStatusCallback callback,
515  *                         void *context);
516  *
517  * DESCRIPTION
518  *
519  *    Writes to a file indicated by the file handle `handle' starting from
520  *    offset of `offset' at most `data_len' bytes of `data'.  The `callback'
521  *    is called to indicate the status of the writing.
522  *
523  ***/
524 void silc_sftp_write(SilcSFTP sftp,
525 		     SilcSFTPHandle handle,
526 		     SilcUInt64 offset,
527 		     const unsigned char *data,
528 		     SilcUInt32 data_len,
529 		     SilcSFTPStatusCallback callback,
530 		     void *context);
531 
532 /****f* silcsftp/SilcSFTPAPI/silc_sftp_remove
533  *
534  * SYNOPSIS
535  *
536  *    void silc_sftp_remove(SilcSFTP sftp,
537  *                          const char *filename,
538  *                          SilcSFTPStatusCallback callback,
539  *                          void *context);
540  *
541  * DESCRIPTION
542  *
543  *    Removes a file indicated by the `filename'.  Calls the `callback'
544  *    to indicate the status of the removing.
545  *
546  ***/
547 void silc_sftp_remove(SilcSFTP sftp,
548 		      const char *filename,
549 		      SilcSFTPStatusCallback callback,
550 		      void *context);
551 
552 /****f* silcsftp/SilcSFTPAPI/silc_sftp_rename
553  *
554  * SYNOPSIS
555  *
556  *    void silc_sftp_rename(SilcSFTP sftp,
557  *                          const char *oldname,
558  *                          const char *newname,
559  *                          SilcSFTPStatusCallback callback,
560  *                          void *context);
561  *
562  * DESCRIPTION
563  *
564  *    Renames a file indicated by the `oldname' to the name `newname'.  The
565  *    `callback' is called to indicate the status of the renaming.
566  *
567  ***/
568 void silc_sftp_rename(SilcSFTP sftp,
569 		      const char *oldname,
570 		      const char *newname,
571 		      SilcSFTPStatusCallback callback,
572 		      void *context);
573 
574 /****f* silcsftp/SilcSFTPAPI/silc_sftp_mkdir
575  *
576  * SYNOPSIS
577  *
578  *    void silc_sftp_mkdir(SilcSFTP sftp,
579  *                         const char *path,
580  *                         SilcSFTPAttributes attrs,
581  *                         SilcSFTPStatusCallback callback,
582  *                         void *context);
583  *
584  * DESCRIPTION
585  *
586  *    Creates a new directory indicated by the `path' with attributes indicated
587  *    by the `attrs'. The `callback' is called to indicate the status of the
588  *    creation.
589  *
590  ***/
591 void silc_sftp_mkdir(SilcSFTP sftp,
592 		     const char *path,
593 		     SilcSFTPAttributes attrs,
594 		     SilcSFTPStatusCallback callback,
595 		     void *context);
596 
597 /****f* silcsftp/SilcSFTPAPI/silc_sftp_rmdir
598  *
599  * SYNOPSIS
600  *
601  *    void silc_sftp_rmdir(SilcSFTP sftp,
602  *                         const char *path,
603  *                         SilcSFTPStatusCallback callback,
604  *                         void *context);
605  *
606  * DESCRIPTION
607  *
608  *    Removes a directory indicated by the `path' and calls the `callback'
609  *    to indicate the status of the removal.
610  *
611  ***/
612 void silc_sftp_rmdir(SilcSFTP sftp,
613 		     const char *path,
614 		     SilcSFTPStatusCallback callback,
615 		     void *context);
616 
617 /****f* silcsftp/SilcSFTPAPI/silc_sftp_opendir
618  *
619  * SYNOPSIS
620  *
621  *    void silc_sftp_opendir(SilcSFTP sftp,
622  *                           const char *path,
623  *                           SilcSFTPHandleCallback callback,
624  *                           void *context);
625  *
626  * DESCRIPTION
627  *
628  *    Opens a directory indicated by the `path'.  The `callback' is called
629  *    to return the opened file handle.
630  *
631  ***/
632 void silc_sftp_opendir(SilcSFTP sftp,
633 		       const char *path,
634 		       SilcSFTPHandleCallback callback,
635 		       void *context);
636 
637 /****f* silcsftp/SilcSFTPAPI/silc_sftp_readdir
638  *
639  * SYNOPSIS
640  *
641  *    void silc_sftp_readdir(SilcSFTP sftp,
642  *                           SilcSFTPHandle handle,
643  *                           SilcSFTPNameCallback callback,
644  *                           void *context);
645  *
646  * DESCRIPTION
647  *
648  *    Reads the contents of the directory indicated by the `handle' and
649  *    calls the `callback' to return the read file(s) from the directory.
650  *
651  ***/
652 void silc_sftp_readdir(SilcSFTP sftp,
653 		       SilcSFTPHandle handle,
654 		       SilcSFTPNameCallback callback,
655 		       void *context);
656 
657 /****f* silcsftp/SilcSFTPAPI/silc_sftp_stat
658  *
659  * SYNOPSIS
660  *
661  *    void silc_sftp_stat(SilcSFTP sftp,
662  *                        const char *path,
663  *                        SilcSFTPAttrCallback callback,
664  *                        void *context);
665  *
666  * DESCRIPTION
667  *
668  *    Gets the file attributes for a file indicated by the `path'. This
669  *    will follow symbolic links also. Calls the `callback' to return the
670  *    file attributes.
671  *
672  ***/
673 void silc_sftp_stat(SilcSFTP sftp,
674 		    const char *path,
675 		    SilcSFTPAttrCallback callback,
676 		    void *context);
677 
678 /****f* silcsftp/SilcSFTPAPI/silc_sftp_lstat
679  *
680  * SYNOPSIS
681  *
682  *    void silc_sftp_lstat(SilcSFTP sftp,
683  *                         const char *path,
684  *                         SilcSFTPAttrCallback callback,
685  *                         void *context);
686  *
687  * DESCRIPTION
688  *
689  *    Gets the file attributes for a file indicated by the `path'. This
690  *    will not follow symbolic links. Calls the `callback' to return the
691  *    file attributes
692  *
693  ***/
694 void silc_sftp_lstat(SilcSFTP sftp,
695 		     const char *path,
696 		     SilcSFTPAttrCallback callback,
697 		     void *context);
698 
699 /****f* silcsftp/SilcSFTPAPI/silc_sftp_fstat
700  *
701  * SYNOPSIS
702  *
703  *    void silc_sftp_fstat(SilcSFTP fstp,
704  *                         SilcSFTPHandle handle,
705  *                         SilcSFTPAttrCallback callback,
706  *                         void *context);
707  *
708  * DESCRIPTION
709  *
710  *    Gets a file attributes for a opened file indicated by the `handle'.
711  *    Calls the `callback' to return the file attributes.
712  *
713  ***/
714 void silc_sftp_fstat(SilcSFTP fstp,
715 		     SilcSFTPHandle handle,
716 		     SilcSFTPAttrCallback callback,
717 		     void *context);
718 
719 /****f* silcsftp/SilcSFTPAPI/silc_sftp_setstat
720  *
721  * SYNOPSIS
722  *
723  *    void silc_sftp_setstat(SilcSFTP sftp,
724  *                           const char *path,
725  *                           SilcSFTPAttributes attrs,
726  *                           SilcSFTPStatusCallback callback,
727  *                           void *context);
728  *
729  * DESCRIPTION
730  *
731  *    Sets a file attributes to a file indicated by the `path' with the
732  *    attributes indicated by the `attrs'.  Calls the `callback' to indicate
733  *    the status of the setting.
734  *
735  ***/
736 void silc_sftp_setstat(SilcSFTP sftp,
737 		       const char *path,
738 		       SilcSFTPAttributes attrs,
739 		       SilcSFTPStatusCallback callback,
740 		       void *context);
741 
742 /****f* silcsftp/SilcSFTPAPI/silc_sftp_fsetstat
743  *
744  * SYNOPSIS
745  *
746  *    void silc_sftp_fsetstat(SilcSFTP sftp,
747  *                            SilcSFTPHandle handle,
748  *                            SilcSFTPAttributes attrs,
749  *                            SilcSFTPStatusCallback callback,
750  *                            void *context);
751  *
752  * DESCRIPTION
753  *
754  *    Sets a file attributes to a opened file indicated by the `handle' with
755  *    the attributes indicated by the `attrs'.  Calls the `callback' to
756  *    indicate the status of the setting.
757  *
758  ***/
759 void silc_sftp_fsetstat(SilcSFTP sftp,
760 			SilcSFTPHandle handle,
761 			SilcSFTPAttributes attrs,
762 			SilcSFTPStatusCallback callback,
763 			void *context);
764 
765 /****f* silcsftp/SilcSFTPAPI/silc_sftp_readlink
766  *
767  * SYNOPSIS
768  *
769  *    void silc_sftp_readlink(SilcSFTP sftp,
770  *                            const char *path,
771  *                            SilcSFTPNameCallback callback,
772  *                            void *context);
773  *
774  * DESCRIPTION
775  *
776  *    Reads the target of a symbolic link indicated by the `path'.  The
777  *    `callback' is called to return the target of the symbolic link.
778  *
779  ***/
780 void silc_sftp_readlink(SilcSFTP sftp,
781 			const char *path,
782 			SilcSFTPNameCallback callback,
783 			void *context);
784 
785 /****f* silcsftp/SilcSFTPAPI/silc_sftp_symlink
786  *
787  * SYNOPSIS
788  *
789  *    void silc_sftp_symlink(SilcSFTP sftp,
790  *                           const char *linkpath,
791  *                           const char *targetpath,
792  *                           SilcSFTPStatusCallback callback,
793  *                           void *context);
794  *
795  * DESCRIPTION
796  *
797  *    Creates a new symbolic link indicated by the `linkpath' to the target
798  *    indicated by the `targetpath'.  The `callback' is called to indicate
799  *    the status of creation.
800  *
801  ***/
802 void silc_sftp_symlink(SilcSFTP sftp,
803 		       const char *linkpath,
804 		       const char *targetpath,
805 		       SilcSFTPStatusCallback callback,
806 		       void *context);
807 
808 /****f* silcsftp/SilcSFTPAPI/silc_sftp_realpath
809  *
810  * SYNOPSIS
811  *
812  *    void silc_sftp_realpath(SilcSFTP sftp,
813  *                            const char *path,
814  *                            SilcSFTPNameCallback callback,
815  *                            void *context);
816  *
817  * DESCRIPTION
818  *
819  *    Canonicalizes the path indicated by the `path' to a absolute path.
820  *    The `callback' is called to return the absolute path.
821  *
822  ***/
823 void silc_sftp_realpath(SilcSFTP sftp,
824 			const char *path,
825 			SilcSFTPNameCallback callback,
826 			void *context);
827 
828 /****f* silcsftp/SilcSFTPAPI/silc_sftp_extended
829  *
830  * SYNOPSIS
831  *
832  *    void silc_sftp_extended(SilcSFTP sftp,
833  *                            const char *request,
834  *                            const unsigned char *data,
835  *                            SilcUInt32 data_len,
836  *                            SilcSFTPExtendedCallback callback,
837  *                            void *context);
838  *
839  * DESCRIPTION
840  *
841  *    Performs an extended operation indicated by the `request' with
842  *    optional extended operation data indicated by the `data'.  The callback
843  *    is called to return any data associated with the extended request.
844  *
845  ***/
846 void silc_sftp_extended(SilcSFTP sftp,
847 			const char *request,
848 			const unsigned char *data,
849 			SilcUInt32 data_len,
850 			SilcSFTPExtendedCallback callback,
851 			void *context);
852 
853 
854 /* SFTP Server Interface */
855 
856 #include "silcsftp_fs.h"
857 
858 /****f* silcsftp/SilcSFTPAPI/silc_sftp_server_start
859  *
860  * SYNOPSIS
861  *
862  *    SilcSFTP silc_sftp_server_start(SilcStream stream,
863  *                                    SilcSchedule schedule,
864  *                                    SilcSFTPErrorCallback error_cb,
865  *                                    void *context,
866  *                                    SilcSFTPFilesystem fs);
867  *
868  * DESCRIPTION
869  *
870  *    Starts SFTP server and returns a context to it.  This function returns
871  *    the allocated SFTP server context or NULL on error.  The `stream' is
872  *    the stream (connection) to the client.  The `error_cb' will be called
873  *    when the `stream' is ended (SILC_SFTP_STATUS_EOF).  The caller is
874  *    responsible of closing and destroying the `stream'.  The `fs' is the
875  *    filesystem context allocated by the application.
876  *
877  ***/
878 SilcSFTP silc_sftp_server_start(SilcStream stream,
879 				SilcSchedule schedule,
880 				SilcSFTPErrorCallback error_cb,
881 				void *context,
882 				SilcSFTPFilesystem fs);
883 
884 /****f* silcsftp/SilcSFTPAPI/silc_sftp_server_shutdown
885  *
886  * SYNOPSIS
887  *
888  *    void silc_sftp_server_shutdown(SilcSFTP sftp);
889  *
890  * DESCRIPTION
891  *
892  *    Shutdown the SFTP server.  The caller is responsible of closing the
893  *    associated stream.  The SFTP context is freed and is invalid after
894  *    this function returns.
895  *
896  ***/
897 void silc_sftp_server_shutdown(SilcSFTP sftp);
898 
899 /****d* silcsftp/SilcSFTPAPI/SilcSFTPMonitors
900  *
901  * NAME
902  *
903  *    typedef enum { ... } SilcSFTPMonitors;
904  *
905  * DESCRIPTION
906  *
907  *    SFTP server monitor types. These can be masked together to monitor
908  *    various client requests.
909  *
910  * SOURCE
911  */
912 typedef enum {
913   SILC_SFTP_MONITOR_INIT        = 0x0001,
914   SILC_SFTP_MONITOR_OPEN        = 0x0002,
915   SILC_SFTP_MONITOR_CLOSE       = 0x0004,
916   SILC_SFTP_MONITOR_READ        = 0x0008,
917   SILC_SFTP_MONITOR_WRITE       = 0x0010,
918   SILC_SFTP_MONITOR_REMOVE      = 0x0020,
919   SILC_SFTP_MONITOR_RENAME      = 0x0040,
920   SILC_SFTP_MONITOR_MKDIR       = 0x0080,
921   SILC_SFTP_MONITOR_RMDIR       = 0x0100,
922   SILC_SFTP_MONITOR_OPENDIR     = 0x0200,
923   SILC_SFTP_MONITOR_READDIR     = 0x0400,
924   SILC_SFTP_MONITOR_STAT        = 0x0800,
925   SILC_SFTP_MONITOR_LSTAT       = 0x1000,
926   SILC_SFTP_MONITOR_FSTAT       = 0x2000,
927   SILC_SFTP_MONITOR_SETSTAT     = 0x4000,
928   SILC_SFTP_MONITOR_FSETSTAT    = 0x8000,
929   SILC_SFTP_MONITOR_READLINK    = 0x10000,
930   SILC_SFTP_MONITOR_SYMLINK     = 0x20000,
931   SILC_SFTP_MONITOR_REALPATH    = 0x40000,
932   SILC_SFTP_MONITOR_EXTENDED    = 0x80000,
933 } SilcSFTPMonitors;
934 /***/
935 
936 /****s* silcsftp/SilcSFTPAPI/SilcSFTPMonitorData
937  *
938  * NAME
939  *
940  *    typedef struct { ... } *SilcSFTPMonitorData, SilcSFTPMonitorDataStruct;
941  *
942  * DESCRIPTION
943  *
944  *    This structure includes the monitor type specific data.  The
945  *    application can check what the client has requested from this
946  *    structure.  See the comments below what data is available for what
947  *    monitor type.
948  *
949  * SOURCE
950  */
951 typedef struct SilcSFTPMonitorDataObject {
952   SilcSFTPVersion version;	/* _INIT */
953   char *name;			/* _OPEN, _REMOVE, _RENAME, _MKDIR,
954 				   _RMDIR, _OPENDIR, _STAT, _LSTAT,
955 				   _SETSTAT, _READLINK, _SYMLINK, _REALPATH */
956   char *name2;			/* _RENAME, _SYMLINK */
957   SilcSFTPFileOperation pflags;	/* _OPEN */
958   SilcUInt64 offset;		/* _READ, _WRITE */
959   SilcUInt32 data_len;		/* _READ, _WRITE */
960   SilcSFTPName names;		/* _READDIR, _READLINK, _REALPATH */
961 } *SilcSFTPMonitorData, SilcSFTPMonitorDataStruct;
962 /***/
963 
964 /****f* silcsftp/SilcSFTPAPI/SilcSFTPMonitor
965  *
966  * SYNOPSIS
967  *
968  *    typedef void (*SilcSFTPMonitor)(SilcSFTP sftp
969  *                                    SilcSFTPMonitors type,
970  *                                    const SilcSFTPMonitorData data,
971  *                                    void *context);
972  *
973  * DESCRIPTION
974  *
975  *    Monitor callback that is called when an specified request is
976  *    received from client.  The `type' is the requested type that
977  *    was being monitored.
978  *
979  ***/
980 typedef void (*SilcSFTPMonitor)(SilcSFTP sftp,
981 				SilcSFTPMonitors type,
982 				const SilcSFTPMonitorData data,
983 				void *context);
984 
985 /****f* silcsftp/SilcSFTPAPI/silc_sftp_server_set_monitor
986  *
987  * SYNOPSIS
988  *
989  *    void silc_sftp_server_set_monitor(SilcSFTP sftp,
990  *                                      SilcSFTPMonitors monitors,
991  *                                      SilcSFTPMonitor monitor,
992  *                                      void *context);
993  *
994  * DESCRIPTION
995  *
996  *    Sets monitor callback to monitor various request sent by a client.
997  *    When request that has been set in the `monitors' is received the
998  *    monitor callback will be called to notify the caller.
999  *
1000  ***/
1001 void silc_sftp_server_set_monitor(SilcSFTP sftp,
1002 				  SilcSFTPMonitors monitors,
1003 				  SilcSFTPMonitor monitor,
1004 				  void *context);
1005 
1006 #endif /* SILCSFTP_H */
1007