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