Changeset 1762


Ignore:
Timestamp:
Apr 20, 2007, 1:27:58 AM (15 years ago)
Author:
joshe
Message:

Quick hack to get some PPP UPnP devices working.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/libtransmission/upnp.c

    r1761 r1762  
    3131#define SSDP_FIRST_DELAY        3750    /* 3 3/4 seconds */
    3232#define SSDP_MAX_DELAY          1800000 /* 30 minutes */
    33 #define UPNP_SERVICE_TYPE       "urn:schemas-upnp-org:service:WANIPConnection:1"
     33#define SERVICE_TYPE_IP         "urn:schemas-upnp-org:service:WANIPConnection:1"
     34#define SERVICE_TYPE_PPP        "urn:schemas-upnp-org:service:WANPPPConnection:1"
    3435#define SOAP_ENVELOPE           "http://schemas.xmlsoap.org/soap/envelope/"
    3536#define LOOP_DETECT_THRESHOLD   10 /* error on 10 add/get/del state changes */
     
    4647{
    4748    char * name;
    48     char * action;
    4949    int    len;
    5050    struct { char * name; char * var; char dir; } * args;
     
    5757    char                    * root;
    5858    int                       port;
     59    int                       ppp;
    5960    char                    * soap;
    6061    char                    * scpd;
     
    123124static int
    124125parseRoot( const char * root, const char *buf, int len,
    125            char ** soap, char ** scpd );
     126           char ** soap, char ** scpd, int * ppp );
    126127static void
    127128addUrlbase( const char * base, char ** path );
     
    138139static tr_http_t *
    139140soapRequest( int retry, const char * host, int port, const char * path,
    140              tr_upnp_action_t * action, ... );
     141             const char * type, tr_upnp_action_t * action, ... );
    141142static void
    142143actionSetup( tr_upnp_action_t * action, const char * name, int prealloc );
     
    674675            }
    675676            else if( parseRoot( dev->root, body, len,
    676                                 &dev->soap, &dev->scpd ) )
     677                                &dev->soap, &dev->scpd, &dev->ppp ) )
    677678            {
    678679                tr_dbg( "upnp device %s: parse root failed", dev->host );
     
    823824{
    824825    tr_http_t  * ret;
    825     char numstr[6];
     826    char         numstr[6];
     827    const char * type;
    826828
    827829    ret = NULL;
     
    847849            }
    848850            snprintf( numstr, sizeof( numstr ), "%i", dev->mappedport );
     851            type = ( dev->ppp ? SERVICE_TYPE_PPP : SERVICE_TYPE_IP );
    849852            ret = soapRequest( dev->soapretry, dev->host, dev->port, dev->soap,
    850                                &dev->addcmd,
     853                               type, &dev->addcmd,
    851854                               "PortMappingEnabled", "1",
    852855                               "PortMappingLeaseDuration", "0",
     
    861864        case UPNPDEV_STATE_GET:
    862865            snprintf( numstr, sizeof( numstr ), "%i", dev->mappedport );
     866            type = ( dev->ppp ? SERVICE_TYPE_PPP : SERVICE_TYPE_IP );
    863867            ret = soapRequest( dev->soapretry, dev->host, dev->port, dev->soap,
    864                                &dev->getcmd,
     868                               type, &dev->getcmd,
    865869                               "RemoteHost", "",
    866870                               "ExternalPort", numstr,
     
    870874        case UPNPDEV_STATE_DEL:
    871875            snprintf( numstr, sizeof( numstr ), "%i", dev->mappedport );
     876            type = ( dev->ppp ? SERVICE_TYPE_PPP : SERVICE_TYPE_IP );
    872877            ret = soapRequest( dev->soapretry, dev->host, dev->port, dev->soap,
    873                                &dev->delcmd,
     878                               type, &dev->delcmd,
    874879                               "RemoteHost", "",
    875880                               "ExternalPort", numstr,
     
    952957static int
    953958parseRoot( const char * root, const char *buf, int len,
    954            char ** soap, char ** scpd )
     959           char ** soap, char ** scpd, int * ppp )
    955960{
    956961    const char * end, * ii, * jj, * kk, * urlbase;
     
    9991004                buf = tr_xmlTagContents( kk, end );
    10001005                if( !tr_xmlFindTagVerifyContents( buf, end, "serviceType",
    1001                                                   UPNP_SERVICE_TYPE, 1 ) )
     1006                                                  SERVICE_TYPE_IP, 1 ) )
    10021007                {
    10031008                    *soap = tr_xmlDupTagContents( buf, end, "controlURL");
    10041009                    *scpd = tr_xmlDupTagContents( buf, end, "SCPDURL");
     1010                    *ppp  = 0;
     1011                    break;
     1012                }
     1013                /* XXX we should save all services of both types and
     1014                   try adding mappings for each in turn */
     1015                else if( !tr_xmlFindTagVerifyContents( buf, end, "serviceType",
     1016                                                       SERVICE_TYPE_PPP, 1 ) )
     1017                {
     1018                    *soap = tr_xmlDupTagContents( buf, end, "controlURL");
     1019                    *scpd = tr_xmlDupTagContents( buf, end, "SCPDURL");
     1020                    *ppp  = 1;
    10051021                    break;
    10061022                }
     
    12081224static tr_http_t *
    12091225soapRequest( int retry, const char * host, int port, const char * path,
    1210              tr_upnp_action_t * action, ... )
     1226             const char * type, tr_upnp_action_t * action, ... )
    12111227{
    12121228    tr_http_t  * http;
     
    12141230    const char * name, * value;
    12151231    int          method;
     1232    char       * actstr;
    12161233
    12171234    method = ( retry ? TR_HTTP_M_POST : TR_HTTP_POST );
     
    12211238        tr_httpAddHeader( http, "Content-type",
    12221239                          "text/xml; encoding=\"utf-8\"" );
    1223         tr_httpAddHeader( http, "SOAPAction", action->action );
     1240        actstr = NULL;
     1241        asprintf( &actstr, "\"%s#%s\"", type, action->name );
     1242        tr_httpAddHeader( http, "SOAPAction", actstr );
     1243        free( actstr );
    12241244        if( retry )
    12251245        {
     
    12321252"    s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">"
    12331253"  <s:Body>"
    1234 "    <u:%s xmlns:u=\"" UPNP_SERVICE_TYPE "\">", action->name );
     1254"    <u:%s xmlns:u=\%s\">", action->name, type );
    12351255
    12361256        va_start( ap, action );
     
    12711291{
    12721292    action->name = strdup( name );
    1273     action->action = NULL;
    1274     asprintf( &action->action, "\"%s#%s\"", UPNP_SERVICE_TYPE, name );
    12751293    assert( NULL == action->args );
    12761294    action->args = malloc( sizeof( *action->args ) * prealloc );
     
    12831301{
    12841302    free( act->name );
    1285     free( act->action );
    12861303    while( 0 < act->len )
    12871304    {
     
    13701387    struct stat sb;
    13711388    char      * data, * soap, * scpd;
    1372     int         fd;
     1389    int         fd, ppp;
    13731390    ssize_t     res;
    13741391
     
    14151432    close( fd );
    14161433
    1417     if( parseRoot( argv[1], data, sb.st_size, &soap, &scpd ) )
     1434    if( parseRoot( argv[1], data, sb.st_size, &soap, &scpd, &ppp ) )
    14181435    {
    14191436        tr_err( "root parsing failed" );
     
    14211438    else
    14221439    {
    1423         tr_err( "soap=%s scpd=%s", soap, scpd );
     1440        tr_err( "soap=%s scpd=%s ppp=%s", soap, scpd, ( ppp ? "yes" : "no" ) );
    14241441        free( soap );
    14251442        free( scpd );
Note: See TracChangeset for help on using the changeset viewer.