X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/putty/blobdiff_plain/65857773290a7bacd6f5d84ab51a9c1228e61e99..f7aa4b367eaf2c1e928f97263bcf4da74680aff3:/psftp.h diff --git a/psftp.h b/psftp.h index af8917db..e6ad00f6 100644 --- a/psftp.h +++ b/psftp.h @@ -3,6 +3,8 @@ * platform-specific SFTP module. */ +#include "int64.h" + #ifndef PUTTY_PSFTP_H #define PUTTY_PSFTP_H @@ -78,27 +80,32 @@ void gui_enable(char *arg); * the times when saving a new file. * * On the other hand, the abstraction is pretty simple: it supports - * only opening a file and reading it, or creating a file and - * writing it. (FIXME: to use this in PSFTP it will also need to - * support seeking to a starting point for restarted transfers.) - * None of this read-and-write, seeking-back-and-forth stuff. + * only opening a file and reading it, or creating a file and writing + * it. None of this read-and-write, seeking-back-and-forth stuff. */ typedef struct RFile RFile; typedef struct WFile WFile; -/* Output params size, mtime and atime can all be NULL if desired */ -RFile *open_existing_file(char *name, unsigned long *size, - unsigned long *mtime, unsigned long *atime); +/* Output params size, perms, mtime and atime can all be NULL if + * desired. perms will be -1 if the OS does not support POSIX permissions. */ +RFile *open_existing_file(char *name, uint64 *size, + unsigned long *mtime, unsigned long *atime, + long *perms); +WFile *open_existing_wfile(char *name, uint64 *size); /* Returns <0 on error, 0 on eof, or number of bytes read, as usual */ int read_from_file(RFile *f, void *buffer, int length); /* Closes and frees the RFile */ void close_rfile(RFile *f); -WFile *open_new_file(char *name); +WFile *open_new_file(char *name, long perms); /* Returns <0 on error, 0 on eof, or number of bytes written, as usual */ int write_to_file(WFile *f, void *buffer, int length); void set_file_times(WFile *f, unsigned long mtime, unsigned long atime); /* Closes and frees the WFile */ void close_wfile(WFile *f); - +/* Seek offset bytes through file */ +enum { FROM_START, FROM_CURRENT, FROM_END }; +int seek_file(WFile *f, uint64 offset, int whence); +/* Get file position */ +uint64 get_file_posn(WFile *f); /* * Determine the type of a file: nonexistent, file, directory or * weird. `weird' covers anything else - named pipes, Unix sockets, @@ -150,6 +157,16 @@ char *wildcard_get_filename(WildcardMatcher *dir); void finish_wildcard_matching(WildcardMatcher *dir); /* + * Vet a filename returned from the remote host, to ensure it isn't + * in some way malicious. The idea is that this function is applied + * to filenames returned from FXP_READDIR, which means we can panic + * if we see _anything_ resembling a directory separator. + * + * Returns TRUE if the filename is kosher, FALSE if dangerous. + */ +int vet_filename(char *name); + +/* * Create a directory. Returns 0 on error, !=0 on success. */ int create_directory(char *name);