Ticket #2028: remote_exitcode.patch

File remote_exitcode.patch, 5.8 KB (added by adurity, 13 years ago)

Patch file for this enhancement

  • daemon/remote.c

    commit ee013d05bb899147c7de9d85735b2ef89abc6534
    Author: Adam Durity <adam@durity.net>
    Date:   Mon May 18 03:23:48 2009 -0700
    
        Updated transmission-remote to include support for exit codes.  Uses POSIX standard EXIT_SUCCESS and EXIT_FAILURE.
    
    diff --git daemon/remote.c daemon/remote.c
    index 99c896f..53dae91 100644
    static void 
    113113showUsage( void )
    114114{
    115115    tr_getopt_usage( MY_NAME, getUsage( ), opts );
    116     exit( 0 );
    117116}
    118117
    119118static int
    numarg( const char * arg ) 
    126125    {
    127126        fprintf( stderr, "Not a number: \"%s\"\n", arg );
    128127        showUsage( );
     128                exit(EXIT_FAILURE);
    129129    }
    130130    return num;
    131131}
    static const char * list_keys[] = { 
    302302    "uploadRatio"
    303303};
    304304
    305 static void
     305static int
    306306readargs( int           argc,
    307307          const char ** argv )
    308308{
    readargs( int argc, 
    310310    int          addingTorrents = 0;
    311311    const char * optarg;
    312312    char         id[4096];
     313        int          status = EXIT_SUCCESS;
    313314
    314315    *id = '\0';
    315316
    readargs( int argc, 
    343344                {
    344345                    fprintf( stderr, "Unknown option: %s\n", optarg );
    345346                    addArg = FALSE;
     347                                        status |= EXIT_FAILURE;
    346348                }
    347349                break;
    348350
    readargs( int argc, 
    607609            case TR_OPT_ERR:
    608610                fprintf( stderr, "invalid option\n" );
    609611                showUsage( );
     612                                status |= EXIT_FAILURE;
    610613                break;
    611614
    612615            default:
    readargs( int argc, 
    624627
    625628        tr_bencFree( &top );
    626629    }
     630        return status;
    627631}
    628632
    629633/* [host:port] or [host] or [port] */
    printTorrentList( tr_benc * top ) 
    12521256    }
    12531257}
    12541258
    1255 static void
     1259static int
    12561260processResponse( const char * host,
    12571261                 int          port,
    12581262                 const void * response,
    12591263                 size_t       len )
    12601264{
    12611265    tr_benc top;
     1266        int status = EXIT_SUCCESS;
    12621267
    12631268    if( debug )
    12641269        fprintf( stderr, "got response (len %d):\n--------\n%*.*s\n--------\n",
    12651270                 (int)len, (int)len, (int)len, (const char*) response );
    12661271
    12671272    if( tr_jsonParse( response, len, &top, NULL ) )
    1268         tr_nerr( MY_NAME, "Unable to parse response \"%*.*s\"", (int)len,
     1273        {
     1274                tr_nerr( MY_NAME, "Unable to parse response \"%*.*s\"", (int)len,
    12691275                 (int)len, (char*)response );
     1276                status |= EXIT_FAILURE;
     1277        }
    12701278    else
    12711279    {
    12721280        int64_t      tag = -1;
    processResponse( const char * host, 
    12921300
    12931301            default:
    12941302                if( tr_bencDictFindStr( &top, "result", &str ) )
    1295                     printf( "%s:%d responded: \"%s\"\n", host, port, str );
     1303                                {
     1304                                        printf( "%s:%d responded: \"%s\"\n", host, port, str );
     1305                                        if (strcmp(str, "success") != 0) // fixme: Would like to use tr_streq but it is #defined in rpcimpl.c
     1306                                        {
     1307                                                status |= EXIT_FAILURE;
     1308                                        }
     1309                                }
     1310                                else {
     1311                                        status |= EXIT_FAILURE;
     1312                                }
    12961313        }
    12971314
    12981315        tr_bencFree( &top );
    12991316    }
     1317        return status;
    13001318}
    13011319
    13021320/* look for a session id in the header in case the server gives back a 409 */
    tr_curl_easy_init( struct evbuffer * writebuf ) 
    13511369}
    13521370   
    13531371
    1354 static void
     1372static int
    13551373processRequests( const char *  host,
    13561374                 int           port,
    13571375                 const char ** reqs,
    processRequests( const char * host, 
    13611379    CURL * curl = NULL;
    13621380    struct evbuffer * buf = evbuffer_new( );
    13631381    char * url = tr_strdup_printf( "http://%s:%d/transmission/rpc", host, port );
     1382        int status = EXIT_SUCCESS;
    13641383
    13651384    for( i=0; i<reqCount; ++i )
    13661385    {
    processRequests( const char * host, 
    13781397        if( debug )
    13791398            fprintf( stderr, "posting:\n--------\n%s\n--------\n", reqs[i] );
    13801399        if( ( res = curl_easy_perform( curl ) ) )
    1381             tr_nerr( MY_NAME, "(%s:%d) %s", host, port, curl_easy_strerror( res ) );
     1400                {
     1401                        tr_nerr( MY_NAME, "(%s:%d) %s", host, port, curl_easy_strerror( res ) );
     1402                        status |= EXIT_FAILURE;
     1403                }
    13821404        else {
    13831405            long response;
    13841406            curl_easy_getinfo( curl, CURLINFO_RESPONSE_CODE, &response );
    13851407            switch( response ) {
    13861408                case 200:
    1387                     processResponse( host, port, EVBUFFER_DATA(buf), EVBUFFER_LENGTH(buf) );
     1409                    status |= processResponse( host, port, EVBUFFER_DATA(buf), EVBUFFER_LENGTH(buf) );
    13881410                    break;
    13891411                case 409:
    13901412                    /* session id failed.  our curl header func has already
    processRequests( const char * host, 
    13961418                    break;
    13971419                default:
    13981420                    fprintf( stderr, "Unexpected response: %s\n", (char*)EVBUFFER_DATA(buf) );
     1421                                        status |= EXIT_FAILURE;
    13991422                    break;
    14001423            }
    14011424        }
    processRequests( const char * host, 
    14061429    evbuffer_free( buf );
    14071430    if( curl != NULL )
    14081431        curl_easy_cleanup( curl );
     1432        return status;
    14091433}
    14101434
    14111435int
    main( int argc, 
    14151439    int    i;
    14161440    int    port = DEFAULT_PORT;
    14171441    char * host = NULL;
     1442        int    exit_status = EXIT_SUCCESS;
    14181443
    1419     if( argc < 2 )
    1420         showUsage( );
     1444    if( argc < 2 )
     1445        {
     1446                showUsage( );
     1447                return EXIT_FAILURE;
     1448        }
     1449       
    14211450
    14221451    getHostAndPort( &argc, argv, &host, &port );
    14231452    if( host == NULL )
    14241453        host = tr_strdup( DEFAULT_HOST );
    14251454
    1426     readargs( argc, (const char**)argv );
     1455    exit_status |= readargs( argc, (const char**)argv );
    14271456    if( reqCount )
    1428         processRequests( host, port, (const char**)reqs, reqCount );
    1429     else
    1430         showUsage( );
     1457        exit_status = processRequests( host, port, (const char**)reqs, reqCount );
     1458    else {
     1459                showUsage( );
     1460                return EXIT_FAILURE;
     1461        }
     1462       
    14311463
    14321464    for( i = 0; i < reqCount; ++i )
    14331465        tr_free( reqs[i] );
    14341466
    14351467    tr_free( host );
    1436     return 0;
     1468    return exit_status;
    14371469}
    14381470