1ccacbc9b0331c30b8be12e8e0349e983abf28fc0Greg Hartman/* $OpenBSD: sftp-client.h,v 1.27 2015/05/08 06:45:13 djm Exp $ */
2bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
3bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman/*
4bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * Copyright (c) 2001-2004 Damien Miller <djm@openbsd.org>
5bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman *
6bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * Permission to use, copy, modify, and distribute this software for any
7bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * purpose with or without fee is hereby granted, provided that the above
8bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * copyright notice and this permission notice appear in all copies.
9bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman *
10bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman */
18bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
19bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman/* Client side of SSH2 filexfer protocol */
20bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
21bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#ifndef _SFTP_CLIENT_H
22bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#define _SFTP_CLIENT_H
23bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
249768ca48f57aaf035f508a473421d210b5145e99Greg Hartman#ifdef USE_SYSTEM_GLOB
259768ca48f57aaf035f508a473421d210b5145e99Greg Hartman# include <glob.h>
269768ca48f57aaf035f508a473421d210b5145e99Greg Hartman#else
279768ca48f57aaf035f508a473421d210b5145e99Greg Hartman# include "openbsd-compat/glob.h"
289768ca48f57aaf035f508a473421d210b5145e99Greg Hartman#endif
299768ca48f57aaf035f508a473421d210b5145e99Greg Hartman
30bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmantypedef struct SFTP_DIRENT SFTP_DIRENT;
31bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
32bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanstruct SFTP_DIRENT {
33bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	char *filename;
34bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	char *longname;
35bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	Attrib a;
36bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman};
37bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
38bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman/*
39bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * Used for statvfs responses on the wire from the server, because the
40bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * server's native format may be larger than the client's.
41bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman */
42bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanstruct sftp_statvfs {
43bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	u_int64_t f_bsize;
44bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	u_int64_t f_frsize;
45bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	u_int64_t f_blocks;
46bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	u_int64_t f_bfree;
47bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	u_int64_t f_bavail;
48bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	u_int64_t f_files;
49bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	u_int64_t f_ffree;
50bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	u_int64_t f_favail;
51bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	u_int64_t f_fsid;
52bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	u_int64_t f_flag;
53bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman	u_int64_t f_namemax;
54bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman};
55bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
56bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman/*
57bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * Initialise a SSH filexfer connection. Returns NULL on error or
58bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * a pointer to a initialized sftp_conn struct on success.
59bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman */
60bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanstruct sftp_conn *do_init(int, int, u_int, u_int, u_int64_t);
61bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
62bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanu_int sftp_proto_version(struct sftp_conn *);
63bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
64bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman/* Close file referred to by 'handle' */
65d059297112922cabb0c674840589be8db821fd9aAdam Langleyint do_close(struct sftp_conn *, const u_char *, u_int);
66bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
67bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman/* Read contents of 'path' to NULL-terminated array 'dir' */
68d059297112922cabb0c674840589be8db821fd9aAdam Langleyint do_readdir(struct sftp_conn *, const char *, SFTP_DIRENT ***);
69bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
70bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman/* Frees a NULL-terminated array of SFTP_DIRENTs (eg. from do_readdir) */
71bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanvoid free_sftp_dirents(SFTP_DIRENT **);
72bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
73bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman/* Delete file 'path' */
74d059297112922cabb0c674840589be8db821fd9aAdam Langleyint do_rm(struct sftp_conn *, const char *);
75bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
76bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman/* Create directory 'path' */
77d059297112922cabb0c674840589be8db821fd9aAdam Langleyint do_mkdir(struct sftp_conn *, const char *, Attrib *, int);
78bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
79bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman/* Remove directory 'path' */
80d059297112922cabb0c674840589be8db821fd9aAdam Langleyint do_rmdir(struct sftp_conn *, const char *);
81bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
82bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman/* Get file attributes of 'path' (follows symlinks) */
83d059297112922cabb0c674840589be8db821fd9aAdam LangleyAttrib *do_stat(struct sftp_conn *, const char *, int);
84bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
85bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman/* Get file attributes of 'path' (does not follow symlinks) */
86d059297112922cabb0c674840589be8db821fd9aAdam LangleyAttrib *do_lstat(struct sftp_conn *, const char *, int);
87bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
88bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman/* Set file attributes of 'path' */
89d059297112922cabb0c674840589be8db821fd9aAdam Langleyint do_setstat(struct sftp_conn *, const char *, Attrib *);
90bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
91bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman/* Set file attributes of open file 'handle' */
92d059297112922cabb0c674840589be8db821fd9aAdam Langleyint do_fsetstat(struct sftp_conn *, const u_char *, u_int, Attrib *);
93bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
94bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman/* Canonicalise 'path' - caller must free result */
95d059297112922cabb0c674840589be8db821fd9aAdam Langleychar *do_realpath(struct sftp_conn *, const char *);
96bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
97bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman/* Get statistics for filesystem hosting file at "path" */
98bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanint do_statvfs(struct sftp_conn *, const char *, struct sftp_statvfs *, int);
99bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
100bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman/* Rename 'oldpath' to 'newpath' */
101d059297112922cabb0c674840589be8db821fd9aAdam Langleyint do_rename(struct sftp_conn *, const char *, const char *, int force_legacy);
102bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
103bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman/* Link 'oldpath' to 'newpath' */
104d059297112922cabb0c674840589be8db821fd9aAdam Langleyint do_hardlink(struct sftp_conn *, const char *, const char *);
105bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
106bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman/* Rename 'oldpath' to 'newpath' */
107d059297112922cabb0c674840589be8db821fd9aAdam Langleyint do_symlink(struct sftp_conn *, const char *, const char *);
108bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
109d059297112922cabb0c674840589be8db821fd9aAdam Langley/* Call fsync() on open file 'handle' */
110d059297112922cabb0c674840589be8db821fd9aAdam Langleyint do_fsync(struct sftp_conn *conn, u_char *, u_int);
111bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
112bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman/*
113bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * Download 'remote_path' to 'local_path'. Preserve permissions and times
114bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * if 'pflag' is set
115bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman */
116d059297112922cabb0c674840589be8db821fd9aAdam Langleyint do_download(struct sftp_conn *, const char *, const char *,
117d059297112922cabb0c674840589be8db821fd9aAdam Langley    Attrib *, int, int, int);
118bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
119bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman/*
120ccacbc9b0331c30b8be12e8e0349e983abf28fc0Greg Hartman * Recursively download 'remote_directory' to 'local_directory'. Preserve
121bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * times if 'pflag' is set
122bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman */
123d059297112922cabb0c674840589be8db821fd9aAdam Langleyint download_dir(struct sftp_conn *, const char *, const char *,
124d059297112922cabb0c674840589be8db821fd9aAdam Langley    Attrib *, int, int, int, int);
125bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
126bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman/*
127bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * Upload 'local_path' to 'remote_path'. Preserve permissions and times
128bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * if 'pflag' is set
129bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman */
130d059297112922cabb0c674840589be8db821fd9aAdam Langleyint do_upload(struct sftp_conn *, const char *, const char *, int, int, int);
131bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
132bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman/*
133ccacbc9b0331c30b8be12e8e0349e983abf28fc0Greg Hartman * Recursively upload 'local_directory' to 'remote_directory'. Preserve
134bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * times if 'pflag' is set
135bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman */
136d059297112922cabb0c674840589be8db821fd9aAdam Langleyint upload_dir(struct sftp_conn *, const char *, const char *, int, int, int,
137d059297112922cabb0c674840589be8db821fd9aAdam Langley    int);
138bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
139bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman/* Concatenate paths, taking care of slashes. Caller must free result. */
140d059297112922cabb0c674840589be8db821fd9aAdam Langleychar *path_append(const char *, const char *);
141bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman
142bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#endif
143