Changeset 5927


Ignore:
Timestamp:
May 24, 2008, 6:22:16 PM (14 years ago)
Author:
charles
Message:

(rpc)

  1. fix #968: 'transmission-remote -r' deletes all
  2. fix error in escaping control characters when serializing tr_benc to JSON
  3. fix small memory leak in rpc command parsing
Location:
trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/daemon/Makefile.am

    r5843 r5927  
    1010    transmission-remote
    1111
    12 COMMON_LDADD = \
     12LDADD = \
    1313    $(top_builddir)/libtransmission/libtransmission.a \
     14    $(top_builddir)/third-party/shttpd/libshttpd.a \
    1415    $(top_builddir)/third-party/miniupnp/libminiupnp.a \
    1516    $(top_builddir)/third-party/libnatpmp/libnatpmp.a \
     
    2122
    2223transmission_daemon_SOURCES = daemon.c
    23 transmission_daemon_LDADD = $(COMMON_LDADD) $(top_builddir)/third-party/shttpd/libshttpd.a
    2424transmission_remote_SOURCES = remote.c
    25 transmission_remote_LDADD = $(COMMON_LDADD)
  • trunk/daemon/remote.c

    r5860 r5927  
    197197            case 'r': tr_bencDictAddStr( &top, "method", "torrent-remove" );
    198198                      if( strcmp( optarg, "all" ) )
    199                           tr_bencDictAddStr( args, "ids", optarg );
     199                          tr_rpc_parse_list_str( tr_bencDictAdd( args, "ids" ), optarg, strlen(optarg) );
    200200                      break;
    201201            case 's': tr_bencDictAddStr( &top, "method", "torrent-start" );
    202202                      if( strcmp( optarg, "all" ) )
    203                           tr_bencDictAddStr( args, "ids", optarg );
     203                          tr_rpc_parse_list_str( tr_bencDictAdd( args, "ids" ), optarg, strlen(optarg) );
    204204                      break;
    205205            case 'S': tr_bencDictAddStr( &top, "method", "torrent-stop" );
    206206                      if( strcmp( optarg, "all" ) )
    207                           tr_bencDictAddStr( args, "ids", optarg );
     207                          tr_rpc_parse_list_str( tr_bencDictAdd( args, "ids" ), optarg, strlen(optarg) );
    208208                      break;
    209209            case 'v': tr_bencDictAddStr( &top, "method", "torrent-verify" );
    210210                      if( strcmp( optarg, "all" ) )
    211                           tr_bencDictAddStr( args, "ids", optarg );
     211                          tr_rpc_parse_list_str( tr_bencDictAdd( args, "ids" ), optarg, strlen(optarg) );
    212212                      break;
    213213            default:
     
    341341        CURLcode res;
    342342        curl_easy_setopt( curl, CURLOPT_POSTFIELDS, reqs[i] );
     343        if( debug )
     344            tr_ninf( MY_NAME, "posting [%s]\n", reqs[i] );
    343345        if(( res = curl_easy_perform( curl )))
    344346            tr_nerr( MY_NAME, "(%s:%d) %s", host, port, curl_easy_strerror( res ) );
  • trunk/libtransmission/bencode.c

    r5901 r5927  
    770770 */
    771771static void
    772 bencWalk( const tr_benc   * top,
     772bencWalk( const tr_benc      * top,
    773773          struct WalkFuncs   * walkFuncs,
    774774          void               * user_data )
     
    802802        }
    803803
    804         switch( val->type )
     804        if( val ) switch( val->type )
    805805        {
    806806            case TYPE_INT:
     
    10961096    {
    10971097        switch( *it ) {
    1098             case '"' :
    1099             case '/' :
    1100             case '\b':
    1101             case '\f':
    1102             case '\n':
    1103             case '\r':
    1104             case '\t':
    1105             case '\\': evbuffer_add_printf( data->out, "\\%c", *it ); break;
     1098            case '/' : evbuffer_add_printf( data->out, "\\/" ); break;
     1099            case '\b': evbuffer_add_printf( data->out, "\\b" ); break;
     1100            case '\f': evbuffer_add_printf( data->out, "\\f" ); break;
     1101            case '\n': evbuffer_add_printf( data->out, "\\n" ); break;
     1102            case '\r': evbuffer_add_printf( data->out, "\\r" ); break;
     1103            case '\t': evbuffer_add_printf( data->out, "\\t" ); break;
     1104            case '"' : evbuffer_add_printf( data->out, "\\\"" ); break;
     1105            case '\\': evbuffer_add_printf( data->out, "\\\\" ); break;
    11061106            default: {
    11071107                if( isascii( *it ) )
  • trunk/libtransmission/rpc.c

    r5913 r5927  
    742742}
    743743
     744/**
     745 * Munge the URI into a usable form.
     746 *
     747 * We have very loose typing on this to make the URIs as simple as possible:
     748 * - anything not a 'tag' or 'method' is automatically in 'arguments'
     749 * - values that are all-digits are numbers
     750 * - values that are all-digits or commas are number lists
     751 * - all other values are strings
     752 */
     753void
     754tr_rpc_parse_list_str( tr_benc     * setme,
     755                       const char  * str_in,
     756                       size_t        len )
     757
     758{
     759    char * str = tr_strndup( str_in, len );
     760    int isNum;
     761    int isNumList;
     762    int commaCount;
     763    const char * walk;
     764
     765    isNum = 1;
     766    isNumList = 1;
     767    commaCount = 0;
     768    walk = str;
     769    for( ; *walk && (isNumList || isNum); ++walk ) {
     770        if( isNumList ) isNumList = *walk=='-' || isdigit(*walk) || *walk==',';
     771        if( isNum     ) isNum     = *walk=='-' || isdigit(*walk);
     772        if( *walk == ',' ) ++commaCount;
     773    }
     774
     775    if( isNum )
     776        tr_bencInitInt( setme, strtol( str, NULL, 10 ) );
     777    else if( !isNumList )
     778        tr_bencInitStrDup( setme, str );
     779    else {
     780        tr_bencInitList( setme, commaCount + 1 );
     781        walk = str;
     782        while( *walk ) {
     783            char * p;
     784            tr_bencListAddInt( setme, strtol( walk, &p, 10 ) );
     785            if( *p!=',' )
     786                break;
     787            walk = p + 1;
     788        }
     789    }
     790
     791    tr_free( str );
     792}
     793
     794
    744795char*
    745796tr_rpc_request_exec_uri( struct tr_handle  * handle,
     
    772823        if( delim )
    773824        {
    774             int isNum = 1;
    775             int isNumList = 1;
    776             const char * walk;
    777825            char * key = tr_strndup( pch, delim-pch );
    778826            int isArg = strcmp( key, "method" ) && strcmp( key, "tag" );
    779827            tr_benc * parent = isArg ? args : ⊤
    780             char * val = next ? tr_strndup( delim+1, next-(delim+1) )
    781                               : tr_strdup( delim+1 );
    782             for( walk=val; *walk && ( isNumList || isNum ); ++walk ) {
    783                 if( isNumList ) isNumList = *walk=='-' || isdigit(*walk) || *walk==',';
    784                 if( isNum     ) isNum     = *walk=='-' || isdigit(*walk);
    785             }
    786             if( isNum )
    787                 tr_bencDictAddInt( parent, key, strtol( val, NULL, 10 ) );
    788             else if( !isNumList )
    789                 tr_bencDictAddStr( parent, key, val );
    790             else {
    791                 tr_benc * numList = tr_bencDictAddList( parent, key, 10 );
    792                 walk = val;
    793                 for( ;; ) {
    794                     char * end;
    795                     tr_bencListAddInt( numList, strtol( walk, &end, 10 ) );
    796                     if( *end!=',' )
    797                         break;
    798                     walk = end + 1;
    799                 }
    800             }
     828            tr_rpc_parse_list_str( tr_bencDictAdd( parent, key ),
     829                                   delim+1,
     830                                   next ? (size_t)(next-(delim+1)) : strlen(delim+1) );
     831            tr_free( key );
    801832        }
    802833        pch = next ? next+1 : NULL;
  • trunk/libtransmission/rpc.h

    r5843 r5927  
    1818***/
    1919
     20struct tr_benc;
    2021struct tr_handle;
    2122
     
    3435                         int               * response_len );
    3536
     37void
     38tr_rpc_parse_list_str( struct tr_benc  * setme,
     39                       const char      * list_str,
     40                       size_t            list_str_len );
     41
    3642#endif
Note: See TracChangeset for help on using the changeset viewer.