]> granicus.if.org Git - transmission/commitdiff
* better RPC handling of requests submitted via http POST
authorCharles Kerr <charles@transmissionbt.com>
Mon, 19 May 2008 18:16:58 +0000 (18:16 +0000)
committerCharles Kerr <charles@transmissionbt.com>
Mon, 19 May 2008 18:16:58 +0000 (18:16 +0000)
* plug a pair of minor memory leaks reported by valgrind.

daemon/remote.c
daemon/transmission-remote.1
libtransmission/rpc-server.c
libtransmission/session.c
libtransmission/utils.h

index 2a3c5b68578c29300188db676e134645d0a997d5..a2941efc34739a3c44104f5ac94b35b079a7ac4d 100644 (file)
@@ -132,42 +132,79 @@ readargs( int argc, char ** argv )
 
     while((( opt = getopt_long( argc, argv, optstr, longopts, NULL ))) != -1 )
     {
-        char * req = NULL;
         char buf[MAX_PATH_LENGTH];
+        tr_benc top, *args;
+        tr_bencInitDict( &top, 3 );
+        args = tr_bencDictAddDict( &top, "args", 0 );
 
         switch( opt )
         {
             case 'g': debug = 1; break;
             case 'h': showUsage( ); break;
-            case 'a': req = tr_strdup_printf( "method=torrent-add&filename=%s", optarg ); break;
-            case 'c': req = tr_strdup_printf( "method=session-set&encryption=%s", optarg ); break;
-            case 'd': req = tr_strdup_printf( "method=session-set&speed-limit-down=%d&speed-limit-down-enabled=1", numarg(optarg) ); break;
-            case 'D': req = tr_strdup( "method=session-set&speed-limit-down-enabled=0" ); break;
-            case 'u': req = tr_strdup_printf( "method=session-set&speed-limit-up=%d&speed-limit-up-enabled:1", numarg(optarg) ); break;
-            case 'U': req = tr_strdup( "method=session-set&speed-limit-up-enabled=0" ); break;
-            case 'e': req = tr_strdup( "method=session-set&pex-allowed=1" ); break;
-            case 'E': req = tr_strdup( "method=session-set&pex-allowed=0" ); break;
-            case 'f': req = tr_strdup_printf( "method=session-set&download-dir=%s", absolutify(buf,sizeof(buf),optarg)); break;
-            case 'l': req = tr_strdup_printf( "method=torrent-list&tag=%d", TAG_LIST ); break;
-            case 'm': req = tr_strdup( "method=session-set&port-forwarding-enabled=1" ); break;
-            case 'M': req = tr_strdup( "method=session-set&port-forwarding-enabled=0" ); break;
-            case 'p': req = tr_strdup_printf( "method=session-set&port=%d", numarg( optarg ) ); break;
-            case 'r': req = strcmp( optarg, "all" )
-                      ? tr_strdup_printf( "method=torrent-remove&ids=%s", optarg )
-                      : tr_strdup       ( "method=torrent-remove" ); break;
-            case 's': req = strcmp( optarg, "all" )
-                      ? tr_strdup_printf( "method=torrent-start&ids=%s", optarg )
-                      : tr_strdup       ( "method=torrent-start" ); break;
-            case 'S': req = strcmp( optarg, "all" )
-                      ? tr_strdup_printf( "method=torrent-stop&ids=%s", optarg )
-                      : tr_strdup       ( "method=torrent-stop" ); break;
-            case 'v': req = strcmp( optarg, "all" )
-                      ? tr_strdup_printf( "method=torrent-verify&ids=%s", optarg )
-                      : tr_strdup       ( "method=torrent-verify" ); break;
+            case 'a': tr_bencDictAddStr( &top, "method", "torrent-add" );
+                      tr_bencDictAddStr( args, "filename", optarg );
+                      break;
+            case 'c': tr_bencDictAddStr( &top, "method", "session-set" );
+                      tr_bencDictAddStr( args, "encryption", optarg );
+                      break;
+            case 'd': tr_bencDictAddStr( &top, "method", "session-set" );
+                      tr_bencDictAddInt( args, "speed-limit-down", numarg( optarg ) );
+                      tr_bencDictAddInt( args, "speed-limit-down-enabled", 1 );
+                      break;
+            case 'D': tr_bencDictAddStr( &top, "method", "session-set" );
+                      tr_bencDictAddInt( args, "speed-limit-down-enabled", 0 );
+                      break;
+            case 'u': tr_bencDictAddStr( &top, "method", "session-set" );
+                      tr_bencDictAddInt( args, "speed-limit-up", numarg( optarg ) );
+                      tr_bencDictAddInt( args, "speed-limit-up-enabled", 1 );
+                      break;
+            case 'U': tr_bencDictAddStr( &top, "method", "session-set" );
+                      tr_bencDictAddInt( args, "speed-limit-up-enabled", 0 );
+                      break;
+            case 'e': tr_bencDictAddStr( &top, "method", "session-set" );
+                      tr_bencDictAddInt( args, "pex-allowed", 1 );
+                      break;
+            case 'E': tr_bencDictAddStr( &top, "method", "session-set" );
+                      tr_bencDictAddInt( args, "pex-allowed", 0 );
+                      break;
+            case 'f': tr_bencDictAddStr( &top, "method", "session-set" );
+                      tr_bencDictAddStr( args, "download-dir", absolutify(buf,sizeof(buf),optarg) );
+                      break;
+            case 'l': tr_bencDictAddStr( &top, "method", "torrent-list" );
+                      tr_bencDictAddInt( &top, "tag", TAG_LIST );
+                      break;
+            case 'm': tr_bencDictAddStr( &top, "method", "session-set" );
+                      tr_bencDictAddInt( args, "port-forwarding-enabled", 1 );
+                      break;
+            case 'M': tr_bencDictAddStr( &top, "method", "session-set" );
+                      tr_bencDictAddInt( args, "port-forwarding-enabled", 0 );
+                      break;
+            case 'p': tr_bencDictAddStr( &top, "method", "session-set" );
+                      tr_bencDictAddInt( args, "port", numarg( optarg ) );
+                      break;
+            case 'r': tr_bencDictAddStr( &top, "method", "torrent-remove" );
+                      if( strcmp( optarg, "all" ) )
+                          tr_bencDictAddStr( args, "ids", optarg );
+                      break;
+            case 's': tr_bencDictAddStr( &top, "method", "torrent-start" );
+                      if( strcmp( optarg, "all" ) )
+                          tr_bencDictAddStr( args, "ids", optarg );
+                      break;
+            case 'S': tr_bencDictAddStr( &top, "method", "torrent-stop" );
+                      if( strcmp( optarg, "all" ) )
+                          tr_bencDictAddStr( args, "ids", optarg );
+                      break;
+            case 'v': tr_bencDictAddStr( &top, "method", "torrent-verify" );
+                      if( strcmp( optarg, "all" ) )
+                          tr_bencDictAddStr( args, "ids", optarg );
+                      break;
+            default:
+                      showUsage( );
+                      break;
         }
 
-        if( req )
-            reqs[reqCount++] = req;
+        reqs[reqCount++] = tr_bencSaveAsJSON( &top, NULL );
+        tr_bencFree( &top );
     }
 }
 
@@ -276,29 +313,30 @@ processRequests( const char * host, int port,
     int i;
     CURL * curl;
     struct evbuffer * buf = evbuffer_new( );
+    char * url = tr_strdup_printf( "http://%s:%d/transmission", host, port );
 
     curl = curl_easy_init( );
     curl_easy_setopt( curl, CURLOPT_VERBOSE, debug );
     curl_easy_setopt( curl, CURLOPT_USERAGENT, MY_NAME"/"LONG_VERSION_STRING );
     curl_easy_setopt( curl, CURLOPT_WRITEFUNCTION, writeFunc );
     curl_easy_setopt( curl, CURLOPT_WRITEDATA, buf );
+    curl_easy_setopt( curl, CURLOPT_POST, 1 );
+    curl_easy_setopt( curl, CURLOPT_URL, url );
 
     for( i=0; i<reqCount; ++i )
     {
         CURLcode res;
-        char * url = tr_strdup_printf( "http://%s:%d/transmission?%s",
-                                       host, port, reqs[i] );
-        curl_easy_setopt( curl, CURLOPT_URL, url );
+        curl_easy_setopt( curl, CURLOPT_POSTFIELDS, reqs[i] );
         if(( res = curl_easy_perform( curl )))
             tr_nerr( MY_NAME, "%s\n", curl_easy_strerror( res ) );
         else
             processResponse( EVBUFFER_DATA( buf ), EVBUFFER_LENGTH( buf ) );
 
         evbuffer_drain( buf, EVBUFFER_LENGTH( buf ) );
-        tr_free( url );
     }
 
     /* cleanup */
+    tr_free( url );
     evbuffer_free( buf );
     curl_easy_cleanup( curl );
 }
@@ -326,5 +364,6 @@ main( int argc, char ** argv )
     for( i=0; i<reqCount; ++i )
         tr_free( reqs[i] );
 
+    tr_free( host );
     return 0;
 }
index 17c707c2485817ac99810ddf5ebd15332f06bf79..7edbda889a204ffb3c778a6d0cbb6e8ad51aab37 100644 (file)
@@ -192,19 +192,19 @@ Add two torrents:
 Show the info hashes of all the torrents on jade:
 .Pp
 .Dl transmission-remote -x -i ssh jade transmission-proxy
+
 .Sh AUTHORS
 .An -nosplit
-The
-.Nm
-program was written by
 .An Charles Kerr ,
 .An Josh Elsasser ,
 .An Eric Petit ,
 and
 .An Mitchell Livingston .
+
 .Sh SEE ALSO
 .Xr transmissioncli 1 ,
 .Xr transmission-daemon 1 ,
 .Xr transmission 1
+
 .Pp
 http://www.transmissionbt.com/
index e77873c4988595a8146aff0c2195460b8e1235ba..9f1cca5a987ec202dad3977506e2a43c656ad17c 100644 (file)
@@ -56,13 +56,12 @@ handle_rpc( struct shttpd_arg * arg )
         {
             evbuffer_add( s->in, arg->in.buf, arg->in.len );
             arg->in.num_bytes = arg->in.len;
-            
-            if( ! ( arg->flags & SHTTPD_MORE_POST_DATA ) )
+            if( arg->flags & SHTTPD_MORE_POST_DATA )
                 return;
-            response = tr_rpc_request_exec_uri( s->session,
-                                                EVBUFFER_DATA( s->in ),
-                                                EVBUFFER_LENGTH( s->in ),
-                                                &len );
+            response = tr_rpc_request_exec_json( s->session,
+                                                 EVBUFFER_DATA( s->in ),
+                                                 EVBUFFER_LENGTH( s->in ),
+                                                 &len );
             evbuffer_drain( s->in, EVBUFFER_LENGTH( s->in ) );
         }
 
@@ -206,6 +205,7 @@ tr_rpcClose( tr_rpc_server ** ps )
     stopServer( s );
     evbuffer_free( s->in );
     evbuffer_free( s->out );
+    tr_free( s->acl );
     tr_free( s );
 }
 
index acf7f3380c04a3e6944ee2edda158a6a67f4895f..ca2772698c590515b62128c67f5ee0391638ee89 100644 (file)
@@ -474,6 +474,7 @@ tr_sessionClose( tr_handle * h )
     tr_free( h->configDir );
     tr_free( h->resumeDir );
     tr_free( h->torrentDir );
+    tr_free( h->downloadDir );
     free( h );
 }
 
index c6597ba71262e759ab2ef29e4f323efa18ba4e2e..2418656d1265ea88242fa653c6cb9cdb34e6a960 100644 (file)
 #endif
 #endif
 
-#ifndef TR_GNUC_NULL_TERMINATED
-#if __GNUC__ >= 4
-#define TR_GNUC_NULL_TERMINATED __attribute__((__sentinel__))
-#else
-#define TR_GNUC_NULL_TERMINATED
-#endif
-#endif
-
 #if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)
 #define TR_GNUC_PURE __attribute__((__pure__))
 #define TR_GNUC_MALLOC __attribute__((__malloc__))