Changeset 3578


Ignore:
Timestamp:
Oct 26, 2007, 3:43:27 AM (15 years ago)
Author:
joshe
Message:

Add IPC messages to set and retrieve the encryption mode.
Implement encryption mode messages in -daemon and -remote.

Location:
trunk
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/daemon/client.c

    r3175 r3578  
    492492
    493493    req->str = dircpy;
     494
     495    return 0;
     496}
     497
     498int
     499client_crypto( const char * mode )
     500{
     501    struct req * req;
     502    char       * modecpy;
     503
     504    modecpy = strdup( mode );
     505    if( NULL == modecpy )
     506    {
     507        mallocmsg( strlen( mode ) );
     508        return -1;
     509    }
     510
     511    req = addreq( IPC_MSG_CRYPTO, -1, NULL );
     512    if( NULL == req )
     513    {
     514        free( modecpy );
     515        return -1;
     516    }
     517
     518    req->str = modecpy;
    494519
    495520    return 0;
     
    801826                buf = ipc_mkint( con->ipc, &buflen, req->id, -1, req->num );
    802827                break;
     828            case IPC_MSG_CRYPTO:
    803829            case IPC_MSG_DIR:
    804830                buf = ipc_mkstr( con->ipc, &buflen, req->id, -1, req->str );
  • trunk/daemon/client.h

    r1708 r3578  
    6565int  client_uplimit  ( int );
    6666int  client_dir      ( const char * );
     67int  client_crypto   ( const char * );
    6768int  client_start    ( size_t, const int * );
    6869int  client_stop     ( size_t, const int * );
  • trunk/daemon/remote.c

    r3401 r3578  
    7373    char              dir[MAXPATHLEN];
    7474    int               pex;
     75    const char *      crypto;
    7576};
    7677
     
    175176        ( '\0' != o.dir[0]          &&   0 > client_dir      ( o.dir     ) ) ||
    176177        ( !SLIST_EMPTY( &o.files )  &&   0 > client_addfiles ( &o.files  ) ) ||
     178        ( o.crypto                  &&   0 > client_crypto   ( o.crypto  ) ) ||
    177179        ( o.startall                &&   0 > client_start    ( 0, NULL   ) ) ||
    178180        ( o.stopall                 &&   0 > client_stop     ( 0, NULL   ) ) ||
     
    230232  "\n"
    231233  "  -a --add <torrent>        Add a torrent\n"
     234  "  -c --encryption preferred Prefer peers to use encryption\n"
     235  "  -c --encryption required  Require encryption for all peers\n"
    232236  "  -d --download-limit <int> Max download rate in KiB/s\n"
    233237  "  -D --download-unlimited   No download rate limit\n"
     
    261265readargs( int argc, char ** argv, struct opts * opts )
    262266{
    263     char optstr[] = "a:d:DeEf:hilmMp:qr:s:S:t:u:Ux";
     267    char optstr[] = "a:c:d:DeEf:hilmMp:qr:s:S:t:u:Ux";
    264268    struct option longopts[] =
    265269    {
    266270        { "add",                required_argument, NULL, 'a' },
     271        { "encryption",         required_argument, NULL, 'c' },
    267272        { "download-limit",     required_argument, NULL, 'd' },
    268273        { "download-unlimited", no_argument,       NULL, 'D' },
     
    307312                    return -1;
    308313                }
     314                break;
     315            case 'c':
     316                if(!strcasecmp(optarg, "preferred"))
     317                    opts->crypto = "preferred";
     318                else if(!strcasecmp(optarg, "required"))
     319                    opts->crypto = "required";
     320                else
     321                    usage("invalid encryption mode: %s", optarg);
    309322                break;
    310323            case 'd':
  • trunk/daemon/server.c

    r3577 r3578  
    105105        0 > ipc_addmsg( gl_tree, IPC_MSG_AUTOMAP,      intmsg  ) ||
    106106        0 > ipc_addmsg( gl_tree, IPC_MSG_AUTOSTART,    intmsg  ) ||
     107        0 > ipc_addmsg( gl_tree, IPC_MSG_CRYPTO,       strmsg  ) ||
    107108        0 > ipc_addmsg( gl_tree, IPC_MSG_DOWNLIMIT,    intmsg  ) ||
    108109        0 > ipc_addmsg( gl_tree, IPC_MSG_DIR,          strmsg  ) ||
    109110        0 > ipc_addmsg( gl_tree, IPC_MSG_GETAUTOMAP,   prefmsg ) ||
    110111        0 > ipc_addmsg( gl_tree, IPC_MSG_GETAUTOSTART, prefmsg ) ||
     112        0 > ipc_addmsg( gl_tree, IPC_MSG_GETCRYPTO,    prefmsg ) ||
    111113        0 > ipc_addmsg( gl_tree, IPC_MSG_GETDOWNLIMIT, prefmsg ) ||
    112114        0 > ipc_addmsg( gl_tree, IPC_MSG_GETDIR,       prefmsg ) ||
     
    636638    switch( id )
    637639    {
     640        case IPC_MSG_CRYPTO:
     641            if(!strcasecmp(val->val.s.s, "preferred"))
     642                torrent_set_encryption(TR_ENCRYPTION_PREFERRED);
     643            else if(!strcasecmp(val->val.s.s, "required"))
     644                torrent_set_encryption(TR_ENCRYPTION_REQUIRED);
     645            else
     646            {
     647                msgresp(client, tag, IPC_MSG_BAD);
     648                return;
     649            }
     650            break;
    638651        case IPC_MSG_DIR:
    639652            torrent_set_directory( val->val.s.s );
     
    903916    uint8_t       * buf;
    904917    size_t          buflen;
     918    const char    * strval;
    905919
    906920    switch( id )
     
    913927            buf = ipc_mkint( client->ipc, &buflen, IPC_MSG_AUTOSTART, tag,
    914928                             torrent_get_autostart() );
     929            break;
     930        case IPC_MSG_GETCRYPTO:
     931            switch(torrent_get_encryption())
     932            {
     933                case TR_ENCRYPTION_PREFERRED:
     934                    strval = "preferred";
     935                    break;
     936                case TR_ENCRYPTION_REQUIRED:
     937                    strval = "required";
     938                    break;
     939                default:
     940                    assert(0);
     941                    return;
     942            }
     943            buf = ipc_mkstr(client->ipc, &buflen, IPC_MSG_CRYPTO, tag, strval);
    915944            break;
    916945        case IPC_MSG_GETDIR:
  • trunk/daemon/torrents.c

    r3576 r3578  
    9898static int                 gl_downlimit = -1;
    9999static char                gl_dir[MAXPATHLEN];
     100static tr_encryption_mode  gl_crypto    = TR_ENCRYPTION_PREFERRED;
    100101
    101102RB_GENERATE_STATIC( tortree, tor, idlinks, toridcmp )
     
    466467{
    467468    return gl_dir;
     469}
     470
     471void
     472torrent_set_encryption(tr_encryption_mode mode)
     473{
     474    tr_setEncryptionMode(gl_handle, mode);
     475    gl_crypto = mode;
     476    savestate();
     477}
     478
     479tr_encryption_mode
     480torrent_get_encryption(void)
     481{
     482    return tr_getEncryptionMode(gl_handle);
    468483}
    469484
     
    738753    }
    739754
     755    str = tr_bencDictFind( &top, "encryption-mode" );
     756    if( NULL != str && TYPE_STR == str->type )
     757    {
     758        if(!strcasecmp(str->val.s.s, "preferred"))
     759            gl_crypto = TR_ENCRYPTION_PREFERRED;
     760        else if(!strcasecmp(str->val.s.s, "required"))
     761            gl_crypto = TR_ENCRYPTION_REQUIRED;
     762    }
     763
     764    tr_setEncryptionMode(gl_handle, gl_crypto);
     765
    740766    list = tr_bencDictFind( &top, "torrents" );
    741767    if( NULL == list || TYPE_LIST != list->type )
     
    795821
    796822    tr_bencInit( &top, TYPE_DICT );
    797     if( tr_bencDictReserve( &top, 8 ) )
     823    if( tr_bencDictReserve( &top, 9 ) )
    798824    {
    799825      nomem:
     
    810836    tr_bencInitStr( tr_bencDictAdd( &top, "default-directory" ),
    811837                    gl_dir, -1, 1 );
     838    if(TR_ENCRYPTION_REQUIRED == gl_crypto)
     839        tr_bencInitStr(tr_bencDictAdd(&top, "encryption-mode"), "required", -1, 1);
     840    else
     841        tr_bencInitStr(tr_bencDictAdd(&top, "encryption-mode"), "preferred", -1, 1);
    812842    list = tr_bencDictAdd( &top, "torrents" );
    813843    tr_bencInit( list, TYPE_LIST );
  • trunk/daemon/torrents.h

    r3111 r3578  
    5858void         torrent_set_directory       ( const char * );
    5959const char * torrent_get_directory       ( void );
     60void         torrent_set_encryption      ( tr_encryption_mode );
     61tr_encryption_mode torrent_get_encryption      ( void );
    6062
    6163#endif /* TR_DAEMON_TORRENTS_H */
  • trunk/doc/ipcproto.txt

    r3403 r3578  
    192192         Negative values are interpreted as no limit.
    193193
     194Key:     "encryption"
     195Version: 2
     196Format:  string
     197Replies: "succeeded", "failed", "not-supported", "bad-format"
     198Example: 10:encryption8:required
     199         "encryption", "required"
     200Details: Set the encryption mode for peer connections. Valid values
     201         are "required" and "preferred".
     202
    194203Key:     "failed"
    195204Version: 2
     
    231240         "get-downlimit", ""
    232241Details: Requests that a "downlimit" message be sent back.
     242
     243Key:     "get-encryption"
     244Version: 2
     245Format:  value is ignored
     246Replies: "failed", "not-supported", "bad-format", "encryption"
     247Example: 14:get-encryption0:
     248         "get-encryption", ""
     249Details: Requests that an "encryption" message be sent back.
    233250
    234251Key:     "get-info"
  • trunk/libtransmission/ipcparse.c

    r3486 r3578  
    141141    { "autostart",           2, IPC_MSG_AUTOSTART,    RB_ENTRY_INITIALIZER() },
    142142    { "bad-format",          2, IPC_MSG_BAD,          RB_ENTRY_INITIALIZER() },
     143    { "encryption",          2, IPC_MSG_CRYPTO,       RB_ENTRY_INITIALIZER() },
    143144    { "directory",           2, IPC_MSG_DIR,          RB_ENTRY_INITIALIZER() },
    144145    { "downlimit",           2, IPC_MSG_DOWNLIMIT,    RB_ENTRY_INITIALIZER() },
     
    146147    { "get-automap",         2, IPC_MSG_GETAUTOMAP,   RB_ENTRY_INITIALIZER() },
    147148    { "get-autostart",       2, IPC_MSG_GETAUTOSTART, RB_ENTRY_INITIALIZER() },
     149    { "get-encryption",      2, IPC_MSG_GETCRYPTO,    RB_ENTRY_INITIALIZER() },
    148150    { "get-directory",       2, IPC_MSG_GETDIR,       RB_ENTRY_INITIALIZER() },
    149151    { "get-downlimit",       2, IPC_MSG_GETDOWNLIMIT, RB_ENTRY_INITIALIZER() },
  • trunk/libtransmission/ipcparse.h

    r3565 r3578  
    4343    IPC_MSG_AUTOSTART,
    4444    IPC_MSG_BAD,
     45    IPC_MSG_CRYPTO,
    4546    IPC_MSG_DIR,
    4647    IPC_MSG_DOWNLIMIT,
     
    4849    IPC_MSG_GETAUTOMAP,
    4950    IPC_MSG_GETAUTOSTART,
     51    IPC_MSG_GETCRYPTO,
    5052    IPC_MSG_GETDIR,
    5153    IPC_MSG_GETDOWNLIMIT,
Note: See TracChangeset for help on using the changeset viewer.