/* Copyright (C) 2007-2008 The Android Open Source Project
**
** This software is licensed under the terms of the GNU General Public
** License version 2, as published by the Free Software Foundation, and
** may be copied, distributed, and modified under those terms.
**
** 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.
*/
#ifndef _PROXY_COMMON_H_
#define _PROXY_COMMON_H_
#include "sockets.h"
#ifdef _WIN32
#include <winsock2.h>
#else
#include <sys/select.h>
#endif
/* types and definitions used by all proxy connections */
typedef enum {
PROXY_EVENT_NONE,
PROXY_EVENT_CONNECTED,
PROXY_EVENT_CONNECTION_REFUSED,
PROXY_EVENT_SERVER_ERROR
} ProxyEvent;
/* event can't be NONE when this callback is called */
typedef void (*ProxyEventFunc)( void* opaque, int fd, ProxyEvent event );
extern void proxy_set_verbose(int mode);
typedef enum {
PROXY_OPTION_AUTH_USERNAME = 1,
PROXY_OPTION_AUTH_PASSWORD,
PROXY_OPTION_HTTP_NOCACHE = 100,
PROXY_OPTION_HTTP_KEEPALIVE,
PROXY_OPTION_HTTP_USER_AGENT,
PROXY_OPTION_MAX
} ProxyOptionType;
typedef struct {
ProxyOptionType type;
const char* string;
int string_len;
} ProxyOption;
/* add a new proxified socket connection to the manager's list. the event function
* will be called when the connection is established or refused.
*
* only IPv4 is supported at the moment, since our slirp code cannot handle IPv6
*
* returns 0 on success, or -1 if there is no proxy service for this type of connection
*/
extern int proxy_manager_add( SockAddress* address,
SocketType sock_type,
ProxyEventFunc ev_func,
void* ev_opaque );
/* remove an on-going proxified socket connection from the manager's list.
* this is only necessary when the socket connection must be canceled before
* the connection accept/refusal occured
*/
extern void proxy_manager_del( void* ev_opaque );
/* this function is called to update the select file descriptor sets
* with those of the proxified connection sockets that are currently managed */
extern void proxy_manager_select_fill( int *pcount,
fd_set* read_fds,
fd_set* write_fds,
fd_set* err_fds);
/* this function is called to act on proxified connection sockets when network events arrive */
extern void proxy_manager_poll( fd_set* read_fds,
fd_set* write_fds,
fd_set* err_fds );
/* this function checks that one can connect to a given proxy. It will simply try to connect()
* to it, for a specified timeout, in milliseconds, then close the connection.
*
* returns 0 in case of success, and -1 in case of error. errno will be set to ETIMEDOUT in
* case of timeout, or ECONNREFUSED if the connection is refused.
*/
extern int proxy_check_connection( const char* proxyname,
int proxyname_len,
int proxyport,
int timeout_ms );
#endif /* END */