Mercurial > gftp.yaz
diff lib/gftp.h @ 1:8b1883341c6f
Initial revision
author | masneyb |
---|---|
date | Mon, 05 Aug 2002 19:46:57 +0000 |
parents | |
children | 83090328581e |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/gftp.h Mon Aug 05 19:46:57 2002 +0000 @@ -0,0 +1,774 @@ +/*****************************************************************************/ +/* gftp.h - include file for the whole ftp program */ +/* Copyright (C) 1998-2002 Brian Masney <masneyb@gftp.org> */ +/* */ +/* This program is free software; you can redistribute it and/or modify */ +/* it under the terms of the GNU General Public License as published by */ +/* the Free Software Foundation; either version 2 of the License, or */ +/* (at your option) any later version. */ +/* */ +/* This program is distributed in the hope that it will be useful, */ +/* but WITHOUT ANY WARRANTY; without even the implied warranty of */ +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */ +/* GNU General Public License for more details. */ +/* */ +/* You should have received a copy of the GNU General Public License */ +/* along with this program; if not, write to the Free Software */ +/* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +/*****************************************************************************/ + +#ifndef __GFTP_H +#define __GFTP_H + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <sys/types.h> +#include <sys/stat.h> +#include <sys/socket.h> +#include <sys/time.h> +#ifndef TIOCGWINSZ +#include <sys/ioctl.h> +#endif +#include <sys/wait.h> +#include <sys/utsname.h> +#include <netinet/in.h> +#include <arpa/inet.h> +#include <glib.h> +#include <limits.h> +#include <netdb.h> +#include <stdio.h> +#include <stdarg.h> +#include <stdlib.h> +#include <errno.h> +#include <fcntl.h> +#include <unistd.h> +#include <ctype.h> +#include <time.h> +#include <utime.h> +#include <signal.h> +#include <termios.h> +#include <pwd.h> +#include <setjmp.h> +#include <dirent.h> +#include <grp.h> +#include <math.h> + +#ifdef HAVE_STRING_H +#include <string.h> +#else +#include <strings.h> +#endif + +#ifdef ENABLE_NLS +#include <libintl.h> +#include <locale.h> +#define _(String) gettext (String) +#else +#define _(String) String +#endif +#define N_(String) String + +#ifndef AF_LOCAL +#define AF_LOCAL AF_UNIX +#endif + +#ifdef HAVE_DMALLOC +#include <dmalloc.h> +#endif + +/* Some general settings */ +#define BASE_CONF_DIR "~/.gftp" +#define CONFIG_FILE BASE_CONF_DIR "/gftprc" +#define BOOKMARKS_FILE BASE_CONF_DIR "/bookmarks" +#define LOG_FILE BASE_CONF_DIR "/gftp.log" +#define MAX_HIST_LEN 10 + +typedef enum gftp_transfer_type_tag +{ + gftp_transfer_passive, + gftp_transfer_active +} gftp_transfer_type; + + +typedef enum gftp_logging_level_tag +{ + gftp_logging_send, + gftp_logging_recv, + gftp_logging_error, + gftp_logging_misc +} gftp_logging_level; + +typedef void (*gftp_logging_func) ( gftp_logging_level level, + void *ptr, + const char *string, ... ); + + +typedef struct gftp_file_tag gftp_file; + +#define GFTP_TRANS_ACTION_OVERWRITE 1 +#define GFTP_TRANS_ACTION_RESUME 2 +#define GFTP_TRANS_ACTION_SKIP 3 + +#define GFTP_DIRECTION_DOWNLOAD 0 +#define GFTP_DIRECTION_UPLOAD 1 + +struct gftp_file_tag +{ + char *file, /* Our filename */ + *user, /* User that owns it */ + *group, /* Group that owns it */ + *attribs, /* Attribs (-rwxr-x-rx) */ + *destfile; /* Full pathname to the destination for the + file transfer */ + time_t datetime; /* File date and time */ + unsigned long size, /* Size of the file */ + startsize; /* Size to start the transfer at */ + unsigned int isdir : 1, /* File type */ + isexe : 1, + islink : 1, + isblock : 1, + ischar : 1, + issocket : 1, + isfifo : 1, + ascii : 1, /* Transfer in ASCII mode */ + selected : 1, /* Is this file selected? */ + was_sel : 1, /* Was this file selected before */ + shown : 1, /* Is this file shown? */ + done_view : 1, /* View the file when done transfering? */ + done_edit : 1, /* Edit the file when done transfering? */ + done_rm : 1, /* Remove the file when done */ + transfer_done : 1, /* Is current file transfer done? */ + is_fd : 1; /* Is this a file descriptor? */ + char transfer_action; /* See the GFTP_TRANS_ACTION_* vars above */ + void *node; /* Pointer to the node for the gui */ + FILE * fd; +}; + + +typedef struct gftp_proxy_hosts_tag +{ + gint32 ipv4_network_address, + ipv4_netmask; + char *domain; +} gftp_proxy_hosts; + + +typedef struct gftp_request_tag gftp_request; + +struct gftp_request_tag +{ + int protonum; /* Current number of the protocol this is + set to */ + char *hostname, /* Hostname we will connect to */ + *username, /* Username for host*/ + *password, /* Password for host */ + *account, /* Account for host (FTP only) */ + *directory, /* Current working directory */ + *proxy_config, /* Proxy configuration */ + *proxy_hostname, /* Proxy hostname */ + *proxy_username, /* Proxy username */ + *proxy_password, /* Proxy password */ + *proxy_account, /* Proxy account (FTP only) */ + *url_prefix, /* URL Prefix (ex: ftp) */ + *protocol_name, /* Protocol description */ + *last_ftp_response, /* Last response from server */ + *last_dir_entry; /* Last dir entry from server */ + size_t last_dir_entry_len; /* Length of last_dir_entry */ + + unsigned int port, /* Port of remote site */ + proxy_port; /* Port of the proxy server */ + + FILE *sockfd, /* Control connection (read) */ + *sockfd_write, /* Control connection (write) */ + *datafd, /* Data connection */ + *cachefd; /* For the directory cache */ + int wakeup_main_thread[2]; /* FD that gets written to by the threads + to wakeup the parent */ + +#if defined (HAVE_GETADDRINFO) && defined (HAVE_GAI_STRERROR) + struct addrinfo *hostp; /* Remote host we are connected to */ +#else + struct hostent host, *hostp; /* Remote host we are connected to */ +#endif + + int data_type; /* ASCII or BINARY (FTP only) */ + unsigned int use_proxy : 1, /* Go out of proxy server */ + always_connected : 1, + need_hostport : 1, + need_userpass : 1, + use_cache : 1, /* Enable or disable the cache */ + use_threads : 1, /* Whether we need to spawn a thread + for this protocol */ + cached : 1, /* Is this directory listing cached? */ + stopable : 1; + + off_t gotbytes; + + void *protocol_data; + + gftp_logging_func logging_function; + void *user_data; + + void (*init) ( gftp_request * request ); + void (*destroy) ( gftp_request * request ); + int (*connect) ( gftp_request * request ); + void (*disconnect) ( gftp_request * request ); + long (*get_file) ( gftp_request * request, + const char *filename, + FILE * fd, + off_t startsize ); + int (*put_file) ( gftp_request * request, + const char *filename, + FILE * fd, + off_t startsize, + off_t totalsize ); + long (*transfer_file) ( gftp_request * fromreq, + const char *fromfile, + off_t fromsize, + gftp_request * toreq, + const char *tofile, + off_t tosize ); + size_t (*get_next_file_chunk) ( gftp_request * request, + char *buf, + size_t size ); + size_t (*put_next_file_chunk) ( gftp_request * request, + char *buf, + size_t size ); + int (*end_transfer) ( gftp_request * request ); + int (*list_files) ( gftp_request * request ); + int (*get_next_file) ( gftp_request * request, + gftp_file *fle, + FILE *fd ); + int (*set_data_type) ( gftp_request * request, + int data_type ); + off_t (*get_file_size) ( gftp_request * request, + const char *filename ); + int (*chdir) ( gftp_request * request, + const char *directory ); + int (*rmdir) ( gftp_request * request, + const char *directory ); + int (*rmfile) ( gftp_request * request, + const char *filename ); + int (*mkdir) ( gftp_request * request, + const char *directory ); + int (*rename) ( gftp_request * request, + const char *oldname, + const char *newname ); + int (*chmod) ( gftp_request * request, + const char *filename, + int mode ); + int (*set_file_time) ( gftp_request * request, + const char *filename, + time_t datettime ); + int (*site) ( gftp_request * request, + const char *filename ); + int (*parse_url) ( gftp_request * request, + const char *url ); + + /* Options */ + gftp_transfer_type transfer_type; /* Passive or non-passive (FTP only) */ + int network_timeout, + retries, + sleep_time, + passive_transfer; + float maxkbs; + char *sftpserv_path; +}; + + +typedef struct gftp_transfer_tag gftp_transfer; + +struct gftp_transfer_tag +{ + gftp_request * fromreq, + * toreq; + + unsigned int transfer_direction : 1, + cancel : 1, + ready : 1, + started : 1, + done : 1, + show : 1, + stalled : 1, + next_file : 1, + skip_file : 1, + current_file_number, + current_file_retries; + + struct timeval starttime, + lasttime; + + double kbs; + + GList * files, + * curfle, + * updfle; + + long numfiles, + numdirs; + + off_t curtrans, /* Current transfered bytes for this file */ + curresumed, /* Resumed bytes for this file */ + trans_bytes, /* Amount of data transfered for entire + transfer */ + total_bytes, /* Grand total bytes for whole transfer */ + resumed_bytes; /* Grand total of resumed bytes for whole + transfer */ + + void * fromwdata, + * towdata; + + void *statmutex, + *structmutex; + void *node; + void *clist; +}; + + +typedef struct gftp_log_tag +{ + char *msg; + gftp_logging_level type; +} gftp_log; + + +typedef struct supported_gftp_protocols_tag +{ + char *name; /* Description of protocol */ + void (*init) (gftp_request * request); /* Init function */ + char *url_prefix; /* URL Prefix */ + int shown; /* Whether this protocol is shown or not to the user + in the protocol dropdown box */ +} supported_gftp_protocols; + + +typedef struct gftp_bookmarks_tag gftp_bookmarks; + +struct gftp_bookmarks_tag +{ + char *path; /* Path */ + char *hostname, /* Our actual internet hostname */ + *protocol, /* Protocol we will connect through */ + *remote_dir, /* Initial directory */ + *local_dir, /* Init local directory */ + *user, /* Username to log in as */ + *pass, /* Our password */ + *acct; /* Account */ + + unsigned int port, /* The port we will connect to */ + isfolder : 1, /* If this is set, then the children field can + be non-NULL */ + save_password : 1; /* Save this password */ + gftp_bookmarks *children, /* The children of this node. */ + *prev, /* The parent of this node */ + *next; /* The next sibling of this node */ + gpointer cnode; + + /* Site options */ + char *sftpserv_path; /* Path to the sftp server */ +}; + + +typedef struct gftp_file_extensions_tag +{ + char *ext, /* The file extension to register */ + *filename, /* The xpm file to display */ + *view_program, /* The program used to view this file */ + *ascii_binary; /* Is this a ASCII transfer or a BINARY transfer */ + int stlen; /* How long is the file extension. */ +} gftp_file_extensions; + + +typedef struct gftp_color_tag +{ + gushort red, + green, + blue; +} gftp_color; + + +typedef struct gftp_config_vars_tag +{ + char *key, /* variable name */ + *description; /* How this field will show up in the dialog */ + gpointer var; /* Pointer to our variable */ + int type, /* See defines below */ + shown; /* Is this shown in the options dialog? */ + char *comment; /* Comment to write out to the config file */ + gpointer widget; +} gftp_config_vars; + +#define CONFIG_INTTEXT 1 +#define CONFIG_FLOATTEXT 2 +#define CONFIG_CHECKBOX 3 +#define CONFIG_LABEL 4 +#define CONFIG_NOTEBOOK 5 +#define CONFIG_HIDEINT 6 +#define CONFIG_TABLE 7 +#define CONFIG_CHARTEXT 8 +#define CONFIG_COMBO 9 +#define CONFIG_TEXT 10 +#define CONFIG_COLOR 11 +#define CONFIG_UINTTEXT 12 +#define CONFIG_CHARPASS 13 + +typedef struct gftp_proxy_type_tag +{ + char *key, + *description; +} gftp_proxy_type; + +#define GFTP_CUSTOM_PROXY_NUM 8 + +/* Global config options */ +extern supported_gftp_protocols gftp_protocols[]; +extern char version[], *emailaddr, *edit_program, *view_program, + *firewall_host, *firewall_username, *firewall_password, + *firewall_account, *proxy_config, *http_proxy_host, + *http_proxy_username, *http_proxy_password, *tmp_directory, + *startup_directory, *ssh_prog_name, *ssh_extra_params, + **ssh_extra_params_list, *default_protocol, *ssh1_sftp_path, + *ssh2_sftp_path; +extern int num_ssh_extra_params; +extern FILE * logfd; +extern double maxkbs; +extern GList * proxy_hosts, * registered_exts, * viewedit_processes, + * file_transfers, * file_transfer_logs; +extern gftp_bookmarks * bookmarks; +extern int do_one_transfer_at_a_time, start_file_transfers, + transfer_in_progress, passive_transfer, sort_dirs_first, + use_default_dl_types, show_hidden_files, refresh_files, + listbox_local_width, listbox_remote_width, listbox_file_height, + transfer_height, log_height, retries, sleep_time, network_timeout, + use_http11, listbox_dblclick_action, file_trans_column, + local_columns[6], remote_columns[6], resolve_symlinks, + firewall_port, http_proxy_port, overwrite_by_default, + append_file_transfers, enable_old_ssh, ssh_need_userpass, + ssh_use_askpass, sshv2_use_sftp_subsys; +extern guint max_log_window_size; +extern GHashTable * bookmarks_htable, * config_htable; +extern GList * localhistory, * remotehistory, * host_history, * port_history, + * user_history; +extern unsigned int host_len, port_len, user_len, localhistlen, remotehistlen; +extern volatile sig_atomic_t viewedit_process_done; +extern gftp_config_vars config_file_vars[]; +extern gftp_proxy_type proxy_type[]; +extern gftp_color send_color, recv_color, error_color, misc_color; + +/* cache.c */ +FILE * gftp_new_cache_entry ( gftp_request * request ); + +FILE * gftp_find_cache_entry ( gftp_request * request ); + +void gftp_clear_cache_files ( void ); + +void gftp_delete_cache_entry ( gftp_request * request ); + +/* config_file.c */ +void gftp_read_config_file ( char **argv, + int get_xpms ); + +void gftp_read_bookmarks ( void ); + +void add_to_bookmark ( gftp_bookmarks *newentry ); + +void gftp_write_config_file ( void ); + +GHashTable * build_bookmarks_hash_table ( gftp_bookmarks * entry ); + +void print_bookmarks ( gftp_bookmarks * bookmarks ); + +/* misc.c */ +char *insert_commas ( unsigned long number, + char *dest_str, + size_t dest_len ); + +long file_countlf ( int filefd, + long endpos ); + +char *alltrim ( char *str ); + +char *expand_path ( const char *src ); + +void remove_double_slashes ( char *string ); + +void make_nonnull ( char **str ); + +int copyfile ( char *source, + char *dest ); + +char *get_xpm_path ( char *filename, + int quit_on_err ); + +int gftp_match_filespec ( char *filename, + char *filespec ); + +int gftp_parse_command_line ( int *argc, + char ***argv ); + +void gftp_usage ( void ); + +gint string_hash_compare ( gconstpointer path1, + gconstpointer path2 ); + +guint string_hash_function ( gconstpointer key ); + +void free_file_list ( GList * filelist ); + +void free_fdata ( gftp_file * fle ); + +gftp_file * copy_fdata ( gftp_file * fle ); + +void swap_socks ( gftp_request * dest, + gftp_request * source ); + +int compare_request ( gftp_request * request1, + gftp_request * request2, + int compare_dirs ); + +void free_tdata ( gftp_transfer * tdata ); + +gftp_request * copy_request ( gftp_request * req ); + +int ptym_open ( char *pts_name ); + +int ptys_open ( int fdm, + char *pts_name ); + +int tty_raw ( int fd ); + +char **make_ssh_exec_args ( gftp_request * request, + char *execname, + int use_sftp_subsys, + char *portstring ); + +char * ssh_start_login_sequence ( gftp_request * request, + int fd ); + +#ifdef G_HAVE_GINT64 +gint64 hton64 ( gint64 val ); +#endif + +/* protocols.c */ +#define GFTP_CONNECTED(request) (request->sockfd != NULL) +#define GFTP_GET_HOSTNAME(request) (request->hostname) +#define GFTP_GET_USERNAME(request) (request->username) +#define GFTP_GET_PASSWORD(request) (request->password) +#define GFTP_GET_ACCOUNT(request) (request->account) +#define GFTP_GET_DIRECTORY(request) (request->directory) +#define GFTP_GET_PORT(request) (request->port) +#define GFTP_GET_PROXY_CONFIG(request) (request->proxy_config) +#define GFTP_GET_PROXY_HOSTNAME(request) (request->proxy_hostname) +#define GFTP_GET_PROXY_USERNAME(request) (request->proxy_username) +#define GFTP_GET_PROXY_PASSWORD(request) (request->proxy_password) +#define GFTP_GET_PROXY_ACCOUNT(request) (request->proxy_account) +#define GFTP_GET_PROXY_PORT(request) (request->proxy_port) +#define GFTP_GET_URL_PREFIX(request) (request->url_prefix) +#define GFTP_GET_PROTOCOL_NAME(request) (request->protocol_name) +#define GFTP_GET_LAST_RESPONSE(request) (request->last_ftp_response) +#define GFTP_GET_LAST_DIRENT(request) (request->last_dir_entry) +#define GFTP_GET_LAST_DIRENT_LEN(request) (request->last_dir_entry_len) +#define GFTP_GET_CONTROL_FD(request) (request->sockfd) +#define GFTP_GET_DATA_FD(request) (request->datafd) +#define GFTP_GET_DATA_TYPE(request) (request->data_type) +#define GFTP_GET_TRANSFER_TYPE(request) (request->transfer_type) +#define GFTP_SET_TRANSFER_TYPE(request,val) (request->transfer_type = (val)) +#define GFTP_GET_LOGGING(request) (request->logging) +#define GFTP_SET_LOGGING(request, val) (request->logging = (val)) +#define GFTP_UNSAFE_SYMLINKS(request) (request->unsafe_symlinks) +#define GFTP_FTP_NUM 0 +#define GFTP_HTTP_NUM 1 +#define GFTP_LOCAL_NUM 2 +#define GFTP_SSHV2_NUM 3 +#define GFTP_BOOKMARK_NUM 4 +#define GFTP_SSH_NUM 5 +#define GFTP_TYPE_BINARY 1 +#define GFTP_TYPE_ASCII 2 +#define GFTP_IS_CONNECTED(request) ((request) != NULL && \ + ((request)->sockfd != NULL || \ + (request)->cached)) + + +void rfc959_init ( gftp_request * request ); + +int rfc959_get_next_file ( gftp_request * request, + gftp_file *fle, + FILE *fd ); + +void rfc2068_init ( gftp_request * request ); + +void local_init ( gftp_request * request ); + +void ssh_init ( gftp_request * request ); + +void sshv2_init ( gftp_request * request ); + +void bookmark_init ( gftp_request * request ); + +gftp_request *gftp_request_new ( void ); + +void gftp_request_destroy ( gftp_request * request ); + +void gftp_file_destroy ( gftp_file *file ); + +int gftp_connect ( gftp_request * request ); + +void gftp_disconnect ( gftp_request * request ); + +size_t gftp_get_file ( gftp_request * request, + const char *filename, + FILE * fd, + size_t startsize ); + +int gftp_put_file ( gftp_request * request, + const char *filename, + FILE * fd, + size_t startsize, + size_t totalsize ); + +long gftp_transfer_file ( gftp_request *fromreq, + const char *fromfile, + FILE * fromfd, + size_t fromsize, + gftp_request *toreq, + const char *tofile, + FILE * tofd, + size_t tosize ); + +size_t gftp_get_next_file_chunk ( gftp_request * request, + char *buf, + size_t size ); + +size_t gftp_put_next_file_chunk ( gftp_request * request, + char *buf, + size_t size ); + +int gftp_list_files ( gftp_request * request ); + +int gftp_parse_url ( gftp_request * request, + const char *url ); + +int gftp_get_next_file ( gftp_request * request, + char *filespec, + gftp_file *fle ); + +int gftp_end_transfer ( gftp_request * request ); + +int gftp_read_response ( gftp_request * request ); + +int gftp_set_data_type ( gftp_request * request, + int data_type ); + +void gftp_set_hostname ( gftp_request * request, + const char *hostname ); + +void gftp_set_username ( gftp_request * request, + const char *username ); + +void gftp_set_password ( gftp_request * request, + const char *password ); + +void gftp_set_account ( gftp_request * request, + const char *account ); + +int gftp_set_directory ( gftp_request * request, + const char *directory ); + +void gftp_set_port ( gftp_request * request, + unsigned int port ); + +void gftp_set_proxy_hostname ( gftp_request * request, + const char *hostname ); + +void gftp_set_proxy_username ( gftp_request * request, + const char *username ); + +void gftp_set_proxy_password ( gftp_request * request, + const char *password ); + +void gftp_set_proxy_account ( gftp_request * request, + const char *account ); + +void gftp_set_proxy_port ( gftp_request * request, + unsigned int port ); + +int gftp_remove_directory ( gftp_request * request, + const char *directory ); + +int gftp_remove_file ( gftp_request * request, + const char *file ); + +int gftp_make_directory ( gftp_request * request, + const char *directory ); + +int gftp_rename_file ( gftp_request * request, + const char *oldname, + const char *newname ); + +int gftp_chmod ( gftp_request * request, + const char *file, + int mode ); + +int gftp_set_file_time ( gftp_request * request, + const char *file, + time_t datetime ); + +char gftp_site_cmd ( gftp_request * request, + const char *command ); + +void gftp_set_proxy_config ( gftp_request * request, + const char *proxy_config ); + +long gftp_get_file_size ( gftp_request * request, + const char *filename ); + +int gftp_need_proxy ( gftp_request * request, + char *service ); + +char *gftp_convert_ascii ( char *buf, + ssize_t *len, + int direction ); + +void gftp_calc_kbs ( gftp_transfer * tdata, + ssize_t num_read ); + +int gftp_parse_ls ( const char *lsoutput, + gftp_file *fle ); + +int gftp_get_all_subdirs ( gftp_transfer * transfer, + void (*update_func) + ( gftp_transfer * transfer )); + +int gftp_get_file_transfer_mode ( char *filename, + int def ); + +int gftp_connect_server ( gftp_request * request, + char *service ); + +void gftp_set_sftpserv_path ( gftp_request * request, + char *path ); + +#if defined (HAVE_GETADDRINFO) && defined (HAVE_GAI_STRERROR) + +int get_port ( struct addrinfo *addr ); + +#else + +struct hostent *r_gethostbyname ( const char *name, + struct hostent *result_buf, + int *h_errnop ); + +struct servent *r_getservbyname ( const char *name, + const char *proto, + struct servent *result_buf, + int *h_errnop ); +#endif + +void gftp_set_config_options ( gftp_request * request ); + +void print_file_list ( GList * list ); + +#endif +