1 /* $Id: miniupnpc-async.h,v 1.13 2014/11/07 11:25:52 nanard Exp $ */ 2 /* miniupnpc-async 3 * Copyright (c) 2008-2017, Thomas BERNARD <miniupnp@free.fr> 4 * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/ 5 * 6 * Permission to use, copy, modify, and/or distribute this software for any 7 * purpose with or without fee is hereby granted, provided that the above 8 * copyright notice and this permission notice appear in all copies. 9 * 10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ 17 #ifndef MINIUPNPC_ASYNC_H_INCLUDED 18 #define MINIUPNPC_ASYNC_H_INCLUDED 19 20 /* for struct sockaddr_storage */ 21 #include <netinet/in.h> 22 /* for fd_set */ 23 #include <sys/select.h> 24 25 #include "declspec.h" 26 #include "upnpreplyparse.h" 27 28 #ifdef __cplusplus 29 extern "C" { 30 #endif 31 32 #define UPNPC_OK 0 33 #define UPNPC_ERR_INVALID_ARGS (-1) 34 #define UPNPC_ERR_SOCKET_FAILED (-2) 35 #define UPNPC_ERR_BIND_FAILED (-3) 36 #define UPNPC_ERR_UNKNOWN_STATE (-4) 37 38 #define UPNPC_SSDP_READABLE 0x0001 39 #define UPNPC_SSDP_WRITEABLE 0x0100 40 #define UPNPC_HTTP_READABLE 0x0002 41 #define UPNPC_HTTP_WRITEABLE 0x0200 42 43 typedef struct upnpc_device { 44 struct upnpc_device * next; 45 enum { 46 EDevInit = 1, 47 EDevGetDescConnect, 48 EDevGetDescRequest, 49 EDevGetDescResponse, 50 EDevReady, 51 EDevSoapConnect, 52 EDevSoapRequest, 53 EDevSoapResponse, 54 EDevFinalized = 99, 55 EDevError = 1000 56 } state; 57 char * root_desc_location; 58 char * control_cif_url; 59 char * control_conn_url; 60 int http_socket; 61 int socket_flags; /* see UPNPC_*_READABLE, etc. */ 62 char * http_request; 63 int http_request_len; 64 int http_request_sent; 65 char * http_response; 66 int http_response_received; 67 int http_response_end_of_headers; 68 int http_response_content_length; 69 int http_response_chunked; 70 int http_response_code; 71 struct NameValueParserData soap_response_data; 72 struct sockaddr_storage selfaddr; 73 socklen_t selfaddrlen; 74 } upnpc_device_t; 75 76 typedef struct { 77 enum { 78 EUPnPInit = 1, 79 EUPnPSendSSDP, 80 EUPnPReceiveSSDP, 81 EUPnPGetDesc, 82 EUPnPReady, 83 EUPnPProcessing, 84 EUPnPFinalized = 99, 85 EUPnPError = 1000 86 } state; 87 int socket_flags; /* see UPNPC_*_READABLE, etc. */ 88 int ssdp_socket; 89 upnpc_device_t * device_list; 90 } upnpc_t; 91 92 int upnpc_init(upnpc_t * p, const char * multicastif); 93 94 int upnpc_finalize(upnpc_t * p); 95 96 int upnpc_get_external_ip_address(upnpc_device_t * p); 97 98 int upnpc_get_link_layer_max_rate(upnpc_device_t * p); 99 100 int upnpc_add_port_mapping(upnpc_device_t * p, 101 const char * remote_host, unsigned short ext_port, 102 unsigned short int_port, const char * int_client, 103 const char * proto, const char * description, 104 unsigned int lease_duration); 105 106 #ifdef UPNPC_USE_SELECT 107 int upnpc_select_fds(upnpc_t * p, int * nfds, fd_set * readfds, fd_set * writefds); 108 void upnpc_check_select_fds(upnpc_t * p, const fd_set * readfds, const fd_set * writefds); 109 #endif /* UPNPC_USE_SELECT */ 110 111 int upnpc_process(upnpc_t * p); 112 113 #ifdef __cplusplus 114 } 115 #endif 116 117 #endif /* MINIUPNPC_ASYNC_H_INCLUDED */ 118 119