Annotation of embedaddon/miniupnpd/miniupnpc-async/testasync.c, revision 1.1
1.1 ! misho 1: /* $Id: testasync.c,v 1.14 2014/11/07 12:07:38 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: #include <stdio.h>
! 18: #include <string.h>
! 19: #include <sys/select.h>
! 20: /* for getnameinfo() : */
! 21: #include <sys/types.h>
! 22: #include <sys/socket.h>
! 23: #include <netdb.h>
! 24: /* compile with -DUPNPC_USE_SELECT to enable upnpc_select_fds() function */
! 25: #include "miniupnpc-async.h"
! 26: #include "upnpreplyparse.h"
! 27:
! 28: enum methods {
! 29: EGetExternalIP,
! 30: EGetRates,
! 31: EAddPortMapping,
! 32: ENothing
! 33: };
! 34:
! 35: int main(int argc, char * * argv)
! 36: {
! 37: char ip_address[64];
! 38: int r, n;
! 39: upnpc_t upnp;
! 40: upnpc_device_t * device = NULL;
! 41: const char * multicastif = NULL;
! 42: enum methods next_method_to_call = EGetExternalIP;
! 43: enum methods last_method = ENothing;
! 44: if(argc>1)
! 45: multicastif = argv[1];
! 46: if((r = upnpc_init(&upnp, multicastif)) < 0) {
! 47: fprintf(stderr, "upnpc_init failed : %d", r);
! 48: return 1;
! 49: }
! 50: r = upnpc_process(&upnp);
! 51: printf("upnpc_process returned %d\n", r);
! 52: while(upnp.state != EUPnPError) {
! 53: int nfds;
! 54: fd_set readfds;
! 55: fd_set writefds;
! 56: /*struct timeval timeout;*/
! 57:
! 58: FD_ZERO(&readfds);
! 59: FD_ZERO(&writefds);
! 60: nfds = 0;
! 61: n = upnpc_select_fds(&upnp, &nfds, &readfds, &writefds);
! 62: if(n <= 0) {
! 63: printf("nothing to select()...\n");
! 64: break;
! 65: }
! 66: #if 0
! 67: timeout.tv_sec = 0;
! 68: timeout.tv_usec = 0;
! 69: #endif
! 70: #if DEBUG
! 71: printf("select(%d, ...);\n", nfds+1);
! 72: #endif /* DEBUG */
! 73: if(select(nfds+1, &readfds, &writefds, NULL, NULL/*&timeout*/) < 0) {
! 74: perror("select");
! 75: return 1;
! 76: }
! 77: upnpc_check_select_fds(&upnp, &readfds, &writefds);
! 78: r = upnpc_process(&upnp);
! 79: #if DEBUG
! 80: printf("upnpc_process returned %d\n", r);
! 81: #endif /* DEBUG */
! 82: if(r < 0)
! 83: break;
! 84: if(upnp.state == EUPnPReady) {
! 85: char * p;
! 86: if(device == NULL) {
! 87: /* select one device */
! 88: device = upnp.device_list; /* pick up the first one */
! 89: }
! 90: printf("Process UPnP IGD Method results : HTTP %d\n", device->http_response_code);
! 91: if(device->http_response_code == 200) {
! 92: switch(last_method) {
! 93: case EGetExternalIP:
! 94: p = GetValueFromNameValueList(&device->soap_response_data, "NewExternalIPAddress");
! 95: printf("ExternalIPAddress = %s\n", p);
! 96: /* p = GetValueFromNameValueList(&pdata, "errorCode");*/
! 97: break;
! 98: case EGetRates:
! 99: p = GetValueFromNameValueList(&device->soap_response_data, "NewLayer1DownstreamMaxBitRate");
! 100: printf("DownStream MaxBitRate = %s\t", p);
! 101: p = GetValueFromNameValueList(&device->soap_response_data, "NewLayer1UpstreamMaxBitRate");
! 102: printf("UpStream MaxBitRate = %s\n", p);
! 103: break;
! 104: case EAddPortMapping:
! 105: printf("OK\n");
! 106: break;
! 107: case ENothing:
! 108: break;
! 109: }
! 110: } else {
! 111: printf("SOAP error :\n");
! 112: printf(" faultcode='%s'\n", GetValueFromNameValueList(&device->soap_response_data, "faultcode"));
! 113: printf(" faultstring='%s'\n", GetValueFromNameValueList(&device->soap_response_data, "faultstring"));
! 114: printf(" errorCode=%s\n", GetValueFromNameValueList(&device->soap_response_data, "errorCode"));
! 115: printf(" errorDescription='%s'\n", GetValueFromNameValueList(&device->soap_response_data, "errorDescription"));
! 116: }
! 117: if(next_method_to_call == ENothing)
! 118: break;
! 119: printf("Ready to call UPnP IGD methods\n");
! 120: last_method = next_method_to_call;
! 121: switch(next_method_to_call) {
! 122: case EGetExternalIP:
! 123: printf("GetExternalIPAddress\n");
! 124: upnpc_get_external_ip_address(device);
! 125: next_method_to_call = EGetRates;
! 126: break;
! 127: case EGetRates:
! 128: printf("GetCommonLinkProperties\n");
! 129: upnpc_get_link_layer_max_rate(device);
! 130: next_method_to_call = EAddPortMapping;
! 131: break;
! 132: case EAddPortMapping:
! 133: if(getnameinfo((struct sockaddr *)&device->selfaddr, device->selfaddrlen,
! 134: ip_address, sizeof(ip_address), NULL, 0, NI_NUMERICHOST | NI_NUMERICSERV) < 0) {
! 135: fprintf(stderr, "getnameinfo() failed\n");
! 136: }
! 137: printf("our IP address is %s\n", ip_address);
! 138: printf("AddPortMapping\n");
! 139: upnpc_add_port_mapping(device,
! 140: NULL /* remote_host */, 40002 /* ext_port */,
! 141: 42042 /* int_port */, ip_address /* int_client */,
! 142: "TCP" /* proto */, "this is a test" /* description */,
! 143: 0 /* lease duration */);
! 144: next_method_to_call = ENothing;
! 145: case ENothing:
! 146: break;
! 147: }
! 148: }
! 149: }
! 150: upnpc_finalize(&upnp);
! 151: return 0;
! 152: }
! 153:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>