-
Notifications
You must be signed in to change notification settings - Fork 0
/
sftp.clj
395 lines (342 loc) · 13 KB
/
sftp.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
(ns clj-libssh2.libssh2.sftp
"Functions for using the SFTP subsystem"
(:refer-clojure :exclude [read])
(:require [net.n01se.clojure-jna :as jna])
(:import [com.sun.jna Pointer]))
; Flags for open-ex
(def OPENFILE 0)
(def OPENDIR 1)
; Flags for rename-ex
(def RENAME_OVERWRITE 0x00000001)
(def RENAME_ATOMIC 0x00000002)
(def RENAME_NATIVE 0x00000004)
; Flags for stat-ex
(def STAT 0)
(def LSTAT 1)
(def SETSTAT 2)
; Flags for symlink-ex
(def SYMLINK 0)
(def READLINK 1)
(def REALPATH 2)
; SFTP attribute flag bits
(def ATTR_SIZE 0x00000001)
(def ATTR_UIDGID 0x00000002)
(def ATTR_PERMISSIONS 0x00000004)
(def ATTR_ACMODTIME 0x00000008)
(def ATTR_EXTENDED 0x80000000)
; SFTP statvfs flag bits
(def ST_RDONLY 0x00000001)
(def ST_NOSUID 0x00000002)
; SFTP filetypes
(def TYPE_REGULAR 1)
(def TYPE_DIRECTORY 2)
(def TYPE_SYMLINK 3)
(def TYPE_SPECIAL 4)
(def TYPE_UNKNOWN 5)
(def TYPE_SOCKET 6)
(def TYPE_CHAR_DEVICE 7)
(def TYPE_BLOCK_DEVICE 8)
(def TYPE_FIFO 9)
; File type
(def S_IFMT 0170000) ; type of file mask
(def S_IFIFO 0010000) ; named pipe (fifo)
(def S_IFCHR 0020000) ; character special
(def S_IFDIR 0040000) ; directory
(def S_IFBLK 0060000) ; block special
(def S_IFREG 0100000) ; regular
(def S_IFLNK 0120000) ; symbolic link
(def S_IFSOCK 0140000) ; socket
; File mode
; Read, write, execute/search by owner
(def S_IRWXU 0000700) ; RWX mask for owner
(def S_IRUSR 0000400) ; R for owner
(def S_IWUSR 0000200) ; W for owner
(def S_IXUSR 0000100) ; X for owner
; Read, write, execute/search by group
(def S_IRWXG 0000070) ; RWX mask for group
(def S_IRGRP 0000040) ; R for group
(def S_IWGRP 0000020) ; W for group
(def S_IXGRP 0000010) ; X for group
; Read, write, execute/search by others
(def S_IRWXO 0000007) ; RWX mask for other
(def S_IROTH 0000004) ; R for other
(def S_IWOTH 0000002) ; W for other
(def S_IXOTH 0000001) ; X for other
; Checks for specific file types
(defn S_ISLNK [m] (= S_IFLNK (bit-and m S_IFMT)))
(defn S_ISREG [m] (= S_IFREG (bit-and m S_IFMT)))
(defn S_ISDIR [m] (= S_IFDIR (bit-and m S_IFMT)))
(defn S_ISCHR [m] (= S_IFCHR (bit-and m S_IFMT)))
(defn S_ISBLK [m] (= S_IFBLK (bit-and m S_IFMT)))
(defn S_ISFIFO [m] (= S_IFIFO (bit-and m S_IFMT)))
(defn S_ISSOCK [m] (= S_IFSOCK (bit-and m S_IFMT)))
; SFTP File Transfer Flags -- (e.g. flags parameter to sftp_open())
; Danger will robinson... APPEND doesn't have any effect on OpenSSH servers
(def FXF_READ 0x00000001)
(def FXF_WRITE 0x00000002)
(def FXF_APPEND 0x00000004)
(def FXF_CREAT 0x00000008)
(def FXF_TRUNC 0x00000010)
(def FXF_EXCL 0x00000020)
; SFTP Status Codes (returned by libssh2_sftp_last_error() )
(def FX_OK 0)
(def FX_EOF 1)
(def FX_NO_SUCH_FILE 2)
(def FX_PERMISSION_DENIED 3)
(def FX_FAILURE 4)
(def FX_BAD_MESSAGE 5)
(def FX_NO_CONNECTION 6)
(def FX_CONNECTION_LOST 7)
(def FX_OP_UNSUPPORTED 8)
(def FX_INVALID_HANDLE 9)
(def FX_NO_SUCH_PATH 10)
(def FX_FILE_ALREADY_EXISTS 11)
(def FX_WRITE_PROTECT 12)
(def FX_NO_MEDIA 13)
(def FX_NO_SPACE_ON_FILESYSTEM 14)
(def FX_QUOTA_EXCEEDED 15)
(def FX_UNKNOWN_PRINCIPLE 16) ; Initial mis-spelling
(def FX_UNKNOWN_PRINCIPAL 16)
(def FX_LOCK_CONFlICT 17) ; Initial mis-spelling
(def FX_LOCK_CONFLICT 17)
(def FX_DIR_NOT_EMPTY 18)
(def FX_NOT_A_DIRECTORY 19)
(def FX_INVALID_FILENAME 20)
(def FX_LINK_LOOP 21)
(def ^{:arglists '([handle])} close-handle
"int libssh2_sftp_close_handle(LIBSSH2_SFTP_HANDLE *handle);"
(jna/to-fn Integer ssh2/libssh2_sftp_close_handle))
(defn close
"int libssh2_sftp_close(LIBSSH2_SFTP_HANDLE *handle);"
[handle]
(close-handle handle))
(defn closedir
"int libssh2_sftp_closedir(LIBSSH2_SFTP_HANDLE *handle);"
[handle]
(close-handle handle))
(def ^{:arglists '([handle attrs setstat])} fstat-ex
"
int libssh2_sftp_fstat_ex(LIBSSH2_SFTP_HANDLE *handle,
LIBSSH2_SFTP_ATTRIBUTES *attrs,
int setstat);"
(jna/to-fn Integer ssh2/libssh2_sftp_fstat_ex))
(defn fsetstat
"
int libssh2_sftp_fsetstat(LIBSSH2_SFTP_HANDLE *handle,
LIBSSH2_SFTP_ATTRIBUTES *attrs);"
[handle attrs]
(fstat-ex handle attrs 1))
(defn fstat
"
int libssh2_sftp_fstat(LIBSSH2_SFTP_HANDLE *handle,
LIBSSH2_SFTP_ATTRIBUTES *attrs);"
[handle attrs]
(fstat-ex handle attrs 0))
(def ^{:arglists '([handle st])} fstatvfs
"
int libssh2_sftp_fstatvfs(LIBSSH2_SFTP_HANDLE *handle,
LIBSSH2_SFTP_STATVFS *st);"
(jna/to-fn Integer ssh2/libssh2_sftp_fstatvfs))
(def ^{:arglists '([handle])} fsync
"int libssh2_sftp_fsync(LIBSSH2_SFTP_HANDLE *handle);"
(jna/to-fn Integer ssh2/libssh2_sftp_fsync))
(def ^{:arglists '([sftp])} get-channel
"LIBSSH2_CHANNEL *libssh2_sftp_get_channel(LIBSSH2_SFTP *sftp);"
(jna/to-fn Pointer ssh2/libssh2_sftp_get_channel))
(def ^{:arglists '([session])} init
"LIBSSH2_SFTP *libssh2_sftp_init(LIBSSH2_SESSION *session);"
(jna/to-fn Pointer ssh2/libssh2_sftp_init))
(def ^{:arglists '([sftp])} last-error
"unsigned long libssh2_sftp_last_error(LIBSSH2_SFTP *sftp);"
(jna/to-fn Long ssh2/libssh2_sftp_last_error))
(declare stat-ex)
(defn lstat
"
int libssh2_sftp_lstat(LIBSSH2_SFTP *sftp,
const char *path,
LIBSSH2_SFTP_ATTRIBUTES *attrs);"
[sftp path attrs]
(stat-ex sftp path (count path) LSTAT attrs))
(def ^{:arglists '([sftp path path-len mode])} mkdir-ex
"
int libssh2_sftp_mkdir_ex(LIBSSH2_SFTP *sftp,
const char *path,
unsigned int path_len, long mode);"
(jna/to-fn Integer ssh2/libssh2_sftp_mkdir_ex))
(defn mkdir
"
int libssh2_sftp_mkdir(LIBSSH2_SFTP *sftp,
const char *path,
long mode);"
[sftp path mode]
(mkdir-ex sftp path (count path) mode))
(def ^{:arglists '([sftp filename filename-len flags mode open-type])} open-ex
"
LIBSSH2_SFTP_HANDLE *libssh2_sftp_open_ex(LIBSSH2_SFTP *sftp,
const char *filename,
unsigned int filename_len,
unsigned long flags,
long mode, int open_type);"
(jna/to-fn Pointer ssh2/libssh2_sftp_open_ex))
(defn open
"
LIBSSH2_SFTP_HANDLE *libssh2_sftp_open(LIBSSH2_SFTP *sftp,
const char *filename,
unsigned long flags,
long mode);"
[sftp filename flags mode]
(open-ex sftp filename (count filename) flags mode OPENFILE))
(defn opendir
"LIBSSH2_SFTP_HANDLE *libssh2_sftp_open(LIBSSH2_SFTP *sftp, const char *path);"
[sftp path]
(open-ex sftp path (count path) 0 0 OPENDIR))
(def ^{:arglists '([handle buffer buffer-maxlen])} read
"
ssize_t libssh2_sftp_read(LIBSSH2_SFTP_HANDLE *handle,
char *buffer, size_t buffer_maxlen);"
(jna/to-fn Integer ssh2/libssh2_sftp_read))
(def ^{:arglists '([handle buffer buffer-maxlen longentry longentry-maxlen attrs])} readdir-ex
"
int libssh2_sftp_readdir_ex(LIBSSH2_SFTP_HANDLE *handle,
char *buffer, size_t buffer_maxlen,
char *longentry,
size_t longentry_maxlen,
LIBSSH2_SFTP_ATTRIBUTES *attrs);"
(jna/to-fn Integer ssh2/libssh2_sftp_readdir_ex))
(defn readdir
"
int libssh2_sftp_readdir_ex(LIBSSH2_SFTP_HANDLE *handle,
char *buffer, size_t buffer_maxlen,
char *longentry,
size_t longentry_maxlen,
LIBSSH2_SFTP_ATTRIBUTES *attrs);"
[handle buffer buffer-maxlen attrs]
(readdir-ex handle buffer buffer-maxlen nil 0 attrs))
(declare symlink-ex)
(defn readlink
"
int libssh2_sftp_readlink(LIBSSH2_SFTP *sftp,
const char *path,
char *target
unsigned int maxlen);"
[sftp path target maxlen]
(symlink-ex sftp path (count path) target maxlen READLINK))
(defn realpath
"
int libssh2_sftp_realpath(LIBSSH2_SFTP *sftp,
const char *path,
char *target
unsigned int maxlen);"
[sftp path target maxlen]
(symlink-ex sftp path (count path) target maxlen REALPATH))
(def ^{:arglists '([sftp source-filename source-filename-len dest-filename dest-filename-len flags])} rename-ex
"
int libssh2_sftp_rename_ex(LIBSSH2_SFTP *sftp,
const char *source_filename,
unsigned int srouce_filename_len,
const char *dest_filename,
unsigned int dest_filename_len,
long flags);"
(jna/to-fn Integer ssh2/libssh2_sftp_rename_ex))
(defn rename
"
int libssh2_sftp_rename(LIBSSH2_SFTP *sftp,
const char *source_filename,
const char *dest_filename);"
[sftp sourcefile destfile]
(rename-ex sftp
sourcefile (count sourcefile)
destfile (count destfile)
(bit-or RENAME_OVERWRITE RENAME_ATOMIC RENAME_NATIVE)))
(declare seek64)
(defn rewind
"void libssh2_sftp_rewind(LIBSSH2_SFTP_HANDLE *handle)"
[handle]
(seek64 handle 0))
(def ^{:arglists '([sftp path path-len])} rmdir-ex
"
int libssh2_sftp_rmdir_ex(LIBSSH2_SFTP *sftp,
const char *path,
unsigned int path_len);"
(jna/to-fn Integer ssh2/libssh2_sftp_rmdir_ex))
(defn rmdir
"
int libssh2_sftp_rmdir(LIBSSH2_SFTP *sftp,
const char *path,
unsigned int path_len);"
[sftp path]
(rmdir-ex sftp path (count path)))
(def ^{:arglists '([handle offset]) :deprecated "libssh2"} seek
"void libssh2_sftp_seek(LIBSSH2_SFTP_HANDLE *handle, size_t offset);"
(jna/to-fn Void ssh2/libssh2_sftp_seek))
(def ^{:arglists '([handle offset])} seek64
"void libssh2_sftp_seek64(LIBSSH2_SFTP_HANDLE *handle, libssh2_uint64_t offset);"
(jna/to-fn Void ssh2/libssh2_sftp_seek64))
(defn setstat
"
int libssh2_sftp_setstat(LIBSSH2_SFTP *sftp,
const char *path,
LIBSSH2_SFTP_ATTRIBUTES *attrs);"
[sftp path attrs]
(stat-ex sftp path (count path) SETSTAT attrs))
(def ^{:arglists '([sftp])} shutdown
"int libssh2_sftp_shutdown(LIBSSH2_SFTP *sftp);"
(jna/to-fn Integer ssh2/libssh2_sftp_shutdown))
(def ^{:arglists '([sftp path path-len stat-type attrs])} stat-ex
"
int libssh2_sftp_stat_ex(LIBSSH2_SFTP *sftp,
const char *path,
unsigned int path_len,
int stat_type,
LIBSSH2_SFTP_ATTRIBUTES *attrs);"
(jna/to-fn Integer ssh2/libssh2_sftp_stat_ex))
(defn stat
"
int libssh2_sftp_stat(LIBSSH2_SFTP *sftp,
const char *path,
LIBSSH2_SFTP_ATTRIBUTES *attrs);"
[sftp path attrs]
(stat-ex sftp path (count path) STAT attrs))
(def ^{:arglists '([sftp path path-len st])} statvfs
"
int libssh2_sftp_statvfs(LIBSSH2_SFTP *sftp,
const char *path,
size_t path_len,
LIBSSH2_SFTP_STATVFS *st);"
(jna/to-fn Integer ssh2/libssh2_sftp_statvfs))
(def ^{:arglists '([sftp path path-len target target-len link-type])} symlink-ex
"
int libssh2_sftp_symlink_ex(LIBSSH2_SFTP *sftp,
const char *path,
unsigned int path_len,
char *target,
unsigned int target_len, int link_type);"
(jna/to-fn Integer ssh2/libssh2_sftp_symlink_ex))
(defn symlink
"
int libssh2_sftp_symlink(LIBSSH2_SFTP *sftp,
const char *path,
char *target);"
[sftp path target]
(symlink-ex sftp path (count path) target (count target) SYMLINK))
(def ^{:arglists '([handle]) :deprecated "libssh2"} tell
"size_t libssh2_sftp_tell(LIBSSH2_SFTP_HANDLE *handle);"
(jna/to-fn Long ssh2/libssh2_sftp_tell))
(def ^{:arglists '([handle])} tell64
"libssh2_uint64_t libssh2_sftp_tell64(LIBSSH2_SFTP_HANDLE *handle);"
(jna/to-fn Long ssh2/libssh2_sftp_tell64))
(def ^{:arglists '([sftp filename filename-len])} unlink-ex
"
int libssh2_sftp_unlink_ex(LIBSSH2_SFTP *sftp,
const char *filename,
unsigned int filename_len);"
(jna/to-fn Integer ssh2/libssh2_sftp_unlink_ex))
(defn unlink
"int libssh2_sftp_unlink_ex(LIBSSH2_SFTP *sftp, const char *filename);"
[sftp filename]
(unlink-ex sftp filename (count filename)))
(def ^{:arglists '([handle buffer count])} write
"
ssize_t libssh2_sftp_write(LIBSSH2_SFTP_HANDLE *handle,
const char *buffer, size_t count);"
(jna/to-fn Integer ssh2/libssh2_sftp_write))