Changeset 6294


Ignore:
Timestamp:
Jul 7, 2008, 9:23:34 PM (13 years ago)
Author:
charles
Message:

(daemon) allow wildcards to be used when adding torrents again, such as "transmission-remote -a ~/Desktop/*torrent"

Location:
trunk/daemon
Files:
2 added
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/daemon/Makefile.am

    r5927 r6294  
    2121    $(PTHREAD_LIBS) -lm
    2222
     23noinst_HEADERS = getopts.h
     24
    2325transmission_daemon_SOURCES = daemon.c
    24 transmission_remote_SOURCES = remote.c
     26transmission_remote_SOURCES = remote.c getopts.c
  • trunk/daemon/remote.c

    r6292 r6294  
    1515#include <string.h> /* strcmp */
    1616
    17 #include <getopt.h>
    1817#include <unistd.h> /* getcwd */
    1918
     
    2827#include <libtransmission/version.h>
    2928
     29#include "getopts.h"
     30
    3031#define MY_NAME "transmission-remote"
    3132#define DEFAULT_HOST "localhost"
     
    3435enum { TAG_LIST, TAG_DETAILS, TAG_FILES, TAG_PEERS };
    3536
     37static const char*
     38getUsage( void )
     39{
     40    return "Transmission "LONG_VERSION_STRING"  http://www.transmissionbt.com/\n"
     41           "A fast and easy BitTorrent client\n"
     42           "\n"
     43           "Usage: "MY_NAME" [host] [options]\n"
     44           "       "MY_NAME" [port] [options]\n"
     45           "       "MY_NAME" [host:port] [options]";
     46}
     47
     48static struct options opts[] =
     49{
     50    { 'a', "add",          "Add torrent files", "a", 0, NULL },
     51    { 'd', "downlimit",    "Set the maximum download speed in KB/s", "d", 1, "<number>" },
     52    { 'D', "no-downlimit", "Don't limit the download speed", "D", 0, NULL },
     53    { 'e', "encryption",   "Set encryption mode [required, preferred, tolerated]", "e", 1, "<mode>" },
     54    { 'f', "files",        "Get a file list for the current torrent(s)", "f", 0, NULL },
     55    { 'g', "debug",        "Print debugging information", "g", 0, NULL },
     56    { 'h', "help",         "Show this help page and exit", "h", 0, NULL },
     57    { 'i', "info",         "Show details of the current torrent(s)", "i", 0, NULL },
     58    { 'l', "list",         "List all torrents", "l", 0, NULL },
     59    { 'm', "portmap",      "Enable portmapping via NAT-PMP or UPnP", "m", 0, NULL },
     60    { 'M', "no-portmap",   "Disable portmapping", "M", 0, NULL },
     61    { 'n', "auth",         "Set username for authentication", "n", 1, "<user>:<pass>" },
     62    { 'p', "port",         "Port to listen for incoming peers", "p", 1, "<port>" },
     63    { 'r', "remove",       "Remove the current torrent(s)", "r", 0, NULL },
     64    { 's', "start",        "Start the current torrent(s)", "s", 0, NULL },
     65    { 'S', "stop",         "Stop the current torrent(s)", "S", 0, NULL },
     66    { 't', "torrent",      "Set the current torrent(s)", "t", 1, "<id|hash|all>" },
     67    { 'u', "uplimit",      "Set the maximum upload speed in KB/s", "u", 1, "<number>" },
     68    { 'U', "no-uplimit",   "Don't limit the upload speed", "U", 0, NULL },
     69    { 'v', "verify",       "Verify the current torrent(s)", "v", 0, NULL },
     70    { 'w', "download-dir", "Set the download folder for new torrents", "w", 1, "<path>" },
     71    { 'x', "pex",          "Enable peer exchange (PEX)", "x", 0, NULL },
     72    { 'X', "no-pex",       "Disable peer exchange (PEX)", "X", 0, NULL },
     73    { 0, NULL, NULL, NULL, 0, NULL }
     74};
     75
    3676static void
    3777showUsage( void )
    3878{
    39     puts( "Transmission "LONG_VERSION_STRING"  http://www.transmissionbt.com/\n"
    40             "A fast and easy BitTorrent client\n"
    41             "\n"
    42             "Usage: "MY_NAME" [host] [options]\n"
    43             "       "MY_NAME" [port] [options]\n"
    44             "       "MY_NAME" [host:port] [options]\n"
    45             "\n"
    46             "Options:\n"
    47             "  -a --add <torrent>        Add a torrent\n"
    48             "  -d --download-limit <int> Max download rate in KiB/s\n"
    49             "  -D --download-unlimited   No download rate limit\n"
    50             "  -e --encryption required  Require encryption for all peers\n"
    51             "  -e --encryption preferred Prefer peers to use encryption\n"
    52             "  -e --encryption tolerated Prefer peers to use plaintext\n"
    53             "  -f --files <id>           Get a file list for the specified torrent\n"
    54             "  -g --debug                Print debugging information\n"
    55             "  -h --help                 Display this message and exit\n"
    56             "  -i --info                 Detailed information for the specified torrent\n"
    57             "  -l --list                 List all torrents\n"
    58             "  -m --port-mapping         Automatic port mapping via NAT-PMP or UPnP\n"
    59             "  -M --no-port-mapping      Disable automatic port mapping\n"
    60             "  -p --port <id>            Port to listen for incoming peers\n"
    61             "  -r --remove <id>          Remove the torrent with the given ID\n"
    62             "  -r --remove all           Remove all torrents\n"
    63             "  -s --start <id>           Start the torrent with the given ID\n"
    64             "  -s --start all            Start all stopped torrents\n"
    65             "  -S --stop <id>            Stop the torrent with the given ID\n"
    66             "  -S --stop all             Stop all running torrents\n"
    67             "  -t --auth <user>:<pass>   Username and password for authentication\n"
    68             "  -u --upload-limit <int>   Max upload rate in KiB/s\n"
    69             "  -U --upload-unlimited     No upload rate limit\n"
    70             "  -v --verify <id>          Verify the torrent's local data\n"
    71             "  -w --download-dir <path>  Folder to set for new torrents\n"
    72             "  -x --enable-pex           Enable peer exchange\n"
    73             "  -X --disable-pex          Disable peer exchange\n" );
     79fprintf( stderr, "asdfasdfasdfasdfasdfasdf\n");
     80    getopts_usage( MY_NAME, getUsage(), opts );
    7481    exit( 0 );
    7582}
     
    116123
    117124static void
     125addIdArg( tr_benc * args, const char * id )
     126{
     127    if( !*id ) {
     128        fprintf( stderr, "No torrent specified!  Please use the -t option first.\n" );
     129        id = "-1"; /* no torrent will have this ID, so should be a no-op */
     130    } else if( strcmp( id, "all" ) ) {
     131        tr_rpc_parse_list_str( tr_bencDictAdd( args, "ids" ), id, strlen(id) );
     132    }
     133}
     134
     135static void
    118136readargs( int argc, char ** argv )
    119137{
    120     int opt;
    121     char optstr[] = "a:d:De:f:ghi:lmMp:r:s:S:t:u:Uv:w:xX";
    122    
    123     const struct option longopts[] =
    124     {
    125         { "add",                required_argument, NULL, 'a' },
    126         { "download-limit",     required_argument, NULL, 'd' },
    127         { "download-unlimited", no_argument,       NULL, 'D' },
    128         { "encryption",         required_argument, NULL, 'e' },
    129         { "files",              required_argument, NULL, 'f' },
    130         { "debug",              no_argument,       NULL, 'g' },
    131         { "help",               no_argument,       NULL, 'h' },
    132         { "info",               required_argument, NULL, 'i' },
    133         { "list",               no_argument,       NULL, 'l' },
    134         { "port-mapping",       no_argument,       NULL, 'm' },
    135         { "no-port-mapping",    no_argument,       NULL, 'M' },
    136         { "port",               required_argument, NULL, 'p' },
    137         { "remove",             required_argument, NULL, 'r' },
    138         { "start",              required_argument, NULL, 's' },
    139         { "stop",               required_argument, NULL, 'S' },
    140         { "auth",               required_argument, NULL, 't' },
    141         { "upload-limit",       required_argument, NULL, 'u' },
    142         { "upload-unlimited",   no_argument,       NULL, 'U' },
    143         { "verify",             required_argument, NULL, 'v' },
    144         { "download-dir",       required_argument, NULL, 'w' },
    145         { "enable-pex",         no_argument,       NULL, 'x' },
    146         { "disable-pex",        no_argument,       NULL, 'X' },
    147         { NULL, 0, NULL, 0 }
    148     };
    149 
    150     while((( opt = getopt_long( argc, argv, optstr, longopts, NULL ))) != -1 )
    151     {
    152         char * tmp;
     138    int c;
     139    int addingTorrents = 0;
     140    char * optarg;
     141    char id[4096];
     142
     143    *id = '\0';
     144
     145    while(( c = getopts( getUsage(), argc, argv, opts, &optarg )))
     146    {
    153147        char buf[MAX_PATH_LENGTH];
    154148        int addArg = TRUE;
    155         int64_t fields = 0;
    156149        tr_benc top, *args;
    157150        tr_bencInitDict( &top, 3 );
     151        int64_t fields = 0;
    158152        args = tr_bencDictAddDict( &top, "arguments", 0 );
    159153
    160         switch( opt )
     154fprintf( stderr, "got opt [%c][%s]\n", (char)c, (optarg?optarg:"(null)") );
     155        switch( c )
    161156        {
    162             case 'g': debug = 1;
     157            case -2:  /* special case: recognize options we didn't set above */
     158fprintf( stderr, "hello world\n" );
     159                      if( addingTorrents ) {
     160                          char * tmp;
     161fprintf( stderr, "adding filename [%s]\n", optarg );
     162                          tr_bencDictAddStr( &top, "method", "torrent-add" );
     163                          tr_bencDictAddStr( args, "metainfo", ((tmp=getEncodedMetainfo(optarg))) );
     164                          tr_free( tmp );
     165                      } else {
     166                          fprintf( stderr, "Unknown option: %s\n", optarg );
     167                          addArg = FALSE;
     168                      }
     169                      break;
     170            case 'a': addingTorrents = 1;
    163171                      addArg = FALSE;
    164172                      break;
    165             case 't': auth = tr_strdup( optarg );
    166                       addArg = FALSE;
    167                       break;
    168             case 'h': showUsage( );
    169                       addArg = FALSE;
    170                       break;
    171             case 'a': tr_bencDictAddStr( &top, "method", "torrent-add" );
    172                       tr_bencDictAddStr( args, "metainfo", ((tmp=getEncodedMetainfo(optarg))) );
    173                       tr_free( tmp );
     173            case 'd': tr_bencDictAddStr( &top, "method", "session-set" );
     174                      tr_bencDictAddInt( args, "speed-limit-down", numarg( optarg ) );
     175                      tr_bencDictAddInt( args, "speed-limit-down-enabled", 1 );
     176                      break;
     177            case 'D': tr_bencDictAddStr( &top, "method", "session-set" );
     178                      tr_bencDictAddInt( args, "speed-limit-down-enabled", 0 );
    174179                      break;
    175180            case 'e': tr_bencDictAddStr( &top, "method", "session-set" );
     
    184189                      tr_bencDictAddInt( args, "fields", fields );
    185190                      break;
     191            case 'g': debug = 1;
     192                      addArg = FALSE;
     193                      break;
    186194            case 'i': tr_bencDictAddStr( &top, "method", "torrent-get" );
    187195                      tr_bencDictAddInt( &top, "tag", TAG_DETAILS );
    188                       tr_rpc_parse_list_str( tr_bencDictAdd( args, "ids" ), optarg, strlen(optarg) );
     196                      addIdArg( args, id );
    189197                      fields = TR_RPC_TORRENT_FIELD_ACTIVITY
    190                              | TR_RPC_TORRENT_FIELD_ANNOUNCE
    191                              | TR_RPC_TORRENT_FIELD_ERROR
    192                              | TR_RPC_TORRENT_FIELD_HISTORY
    193                              | TR_RPC_TORRENT_FIELD_ID
    194                              | TR_RPC_TORRENT_FIELD_INFO
    195                              | TR_RPC_TORRENT_FIELD_SCRAPE
    196                              | TR_RPC_TORRENT_FIELD_SIZE
    197                              | TR_RPC_TORRENT_FIELD_TRACKER_STATS;
     198                          | TR_RPC_TORRENT_FIELD_ANNOUNCE
     199                          | TR_RPC_TORRENT_FIELD_ERROR
     200                          | TR_RPC_TORRENT_FIELD_HISTORY
     201                          | TR_RPC_TORRENT_FIELD_ID
     202                          | TR_RPC_TORRENT_FIELD_INFO
     203                          | TR_RPC_TORRENT_FIELD_SCRAPE
     204                          | TR_RPC_TORRENT_FIELD_SIZE
     205                          | TR_RPC_TORRENT_FIELD_TRACKER_STATS;
    198206                      tr_bencDictAddInt( args, "fields", fields );
    199                       break;
    200             case 'd': tr_bencDictAddStr( &top, "method", "session-set" );
    201                       tr_bencDictAddInt( args, "speed-limit-down", numarg( optarg ) );
    202                       tr_bencDictAddInt( args, "speed-limit-down-enabled", 1 );
    203                       break;
    204             case 'D': tr_bencDictAddStr( &top, "method", "session-set" );
    205                       tr_bencDictAddInt( args, "speed-limit-down-enabled", 0 );
    206                       break;
    207             case 'u': tr_bencDictAddStr( &top, "method", "session-set" );
    208                       tr_bencDictAddInt( args, "speed-limit-up", numarg( optarg ) );
    209                       tr_bencDictAddInt( args, "speed-limit-up-enabled", 1 );
    210                       break;
    211             case 'U': tr_bencDictAddStr( &top, "method", "session-set" );
    212                       tr_bencDictAddInt( args, "speed-limit-up-enabled", 0 );
    213207                      break;
    214208            case 'l': tr_bencDictAddStr( &top, "method", "torrent-get" );
     
    225219                      tr_bencDictAddInt( args, "port-forwarding-enabled", 0 );
    226220                      break;
     221            case 'n': auth = tr_strdup( optarg );
     222                      addArg = FALSE;
     223                      break;
    227224            case 'p': tr_bencDictAddStr( &top, "method", "session-set" );
    228225                      tr_bencDictAddInt( args, "port", numarg( optarg ) );
    229226                      break;
    230227            case 'r': tr_bencDictAddStr( &top, "method", "torrent-remove" );
    231                       if( strcmp( optarg, "all" ) )
    232                           tr_rpc_parse_list_str( tr_bencDictAdd( args, "ids" ), optarg, strlen(optarg) );
     228                      addIdArg( args, id );
    233229                      break;
    234230            case 's': tr_bencDictAddStr( &top, "method", "torrent-start" );
    235                       if( strcmp( optarg, "all" ) )
    236                           tr_rpc_parse_list_str( tr_bencDictAdd( args, "ids" ), optarg, strlen(optarg) );
     231                      addIdArg( args, id );
    237232                      break;
    238233            case 'S': tr_bencDictAddStr( &top, "method", "torrent-stop" );
    239                       if( strcmp( optarg, "all" ) )
    240                           tr_rpc_parse_list_str( tr_bencDictAdd( args, "ids" ), optarg, strlen(optarg) );
     234                      addIdArg( args, id );
     235                      break;
     236            case 't': tr_strlcpy( id, optarg, sizeof( id ) );
     237                      addArg = FALSE;
     238                      break;
     239            case 'u': tr_bencDictAddStr( &top, "method", "session-set" );
     240                      tr_bencDictAddInt( args, "speed-limit-up", numarg( optarg ) );
     241                      tr_bencDictAddInt( args, "speed-limit-up-enabled", 1 );
     242                      break;
     243            case 'U': tr_bencDictAddStr( &top, "method", "session-set" );
     244                      tr_bencDictAddInt( args, "speed-limit-up-enabled", 0 );
    241245                      break;
    242246            case 'v': tr_bencDictAddStr( &top, "method", "torrent-verify" );
    243                       if( strcmp( optarg, "all" ) )
    244                           tr_rpc_parse_list_str( tr_bencDictAdd( args, "ids" ), optarg, strlen(optarg) );
     247                      addIdArg( args, id );
    245248                      break;
    246249            case 'w': tr_bencDictAddStr( &top, "method", "session-set" );
     
    253256                      tr_bencDictAddInt( args, "pex-allowed", 0 );
    254257                      break;
    255             default:
     258            default:  fprintf( stderr, "got opt [%d]\n", (int)c );
    256259                      showUsage( );
    257                       addArg = FALSE;
    258260                      break;
    259261        }
Note: See TracChangeset for help on using the changeset viewer.