Changeset 8440


Ignore:
Timestamp:
May 19, 2009, 11:20:35 PM (12 years ago)
Author:
charles
Message:

(trunk) update to dht 0.5

Location:
trunk/third-party/dht
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/third-party/dht/CHANGES

    r8433 r8440  
     119 May 2009: dht-0.5
     2
     3  * Made reading of /dev/urandom a function provided by the user.
     4  * Implemented the ``v'' extension that identifies node implementations.
     5
    1618 May 2009: dht-0.4
    27
  • trunk/third-party/dht/README

    r8433 r8440  
    163163SHA-1 function.
    164164
     165* dht_random_bytes
     166
     167This should fill the supplied buffer with true random bytes.
     168
    165169Final notes
    166170***********
  • trunk/third-party/dht/dht-example.c

    r8433 r8440  
    201201
    202202    /* Init the dht.  This sets the socket into non-blocking mode. */
    203     rc = dht_init(s, myid);
     203    rc = dht_init(s, myid, NULL);
    204204    if(rc < 0) {
    205205        perror("dht_init");
     
    328328}
    329329#endif
     330
     331int
     332dht_random_bytes(void *buf, size_t size)
     333{
     334    int fd, rc, save;
     335
     336    fd = open("/dev/urandom", O_RDONLY);
     337    if(fd < 0)
     338        return -1;
     339
     340    rc = read(fd, buf, size);
     341
     342    save = errno;
     343    close(fd);
     344    errno = save;
     345
     346    return rc;
     347}
  • trunk/third-party/dht/dht.c

    r8433 r8440  
    154154static int send_get_peers(int s, struct sockaddr *sa, int salen,
    155155                          unsigned char *tid, int tid_len,
    156                           unsigned char *infohash, unsigned short port,
    157                           int confirm);
     156                          unsigned char *infohash, int confirm);
    158157static int send_announce_peer(int s, struct sockaddr *sa, int salen,
    159158                              unsigned char *tid, int tid_len,
     
    194193
    195194static unsigned char myid[20];
     195static int have_v = 0;
     196static unsigned char my_v[9];
    196197static unsigned char secret[8];
    197198static unsigned char oldsecret[8];
     
    794795    make_tid(tid, "gp", sr->tid);
    795796    send_get_peers(s, (struct sockaddr*)&n->sin,
    796                    sizeof(struct sockaddr_in),
    797                    tid, 4, sr->id, sr->tid,
     797                   sizeof(struct sockaddr_in), tid, 4, sr->id,
    798798                   n->reply_time >= now.tv_sec - 15);
    799799    n->pinged++;
     
    10231023        if(i >= st->maxpeers) {
    10241024            /* Need to expand the array. */
     1025            struct peer *new_peers;
    10251026            int n;
    1026             struct peer *new_peers;
    10271027            if(st->maxpeers > DHT_MAX_PEERS / 2)
    10281028                return 0;
     
    10431043
    10441044static int
    1045 expire_storage( void )
     1045expire_storage(void)
    10461046{
    10471047    struct storage *st = storage, *previous = NULL;
     
    11071107
    11081108static int
    1109 rotate_secrets( void )
    1110 {
    1111     int fd;
    1112     unsigned seed;
    1113 
    1114     fd = open("/dev/urandom", O_RDONLY);
    1115     if(fd < 0)
     1109rotate_secrets(void)
     1110{
     1111    int rc;
     1112
     1113    rotate_secrets_time = now.tv_sec + 900 + random() % 1800;
     1114
     1115    memcpy(oldsecret, secret, sizeof(secret));
     1116    rc = dht_random_bytes(secret, sizeof(secret));
     1117
     1118    if(rc < 0)
    11161119        return -1;
    11171120
    1118     memcpy(oldsecret, secret, sizeof(secret));
    1119     read(fd, secret, sizeof(secret));
    1120 
    1121     read(fd, &seed, sizeof(seed));
    1122     srandom(seed);
    1123 
    1124     close(fd);
    1125     rotate_secrets_time = now.tv_sec + 900 + random() % 1800;
    11261121    return 1;
    11271122}
     
    12711266
    12721267int
    1273 dht_init(int s, const unsigned char *id)
     1268dht_init(int s, const unsigned char *id, const unsigned char *v)
    12741269{
    12751270    int rc;
     
    12901285    rc = fcntl(s, F_GETFL, 0);
    12911286    if(rc < 0)
    1292         return -1;
     1287        goto fail;
    12931288
    12941289    rc = fcntl(s, F_SETFL, (rc | O_NONBLOCK));
    12951290    if(rc < 0)
    1296         return -1;
     1291        goto fail;
    12971292
    12981293    memcpy(myid, id, 20);
     1294    if(v) {
     1295        memcpy(my_v, "1:v4:", 5);
     1296        memcpy(my_v + 5, v, 4);
     1297        have_v = 1;
     1298    } else {
     1299        have_v = 0;
     1300    }
    12991301
    13001302    gettimeofday(&now, NULL);
     
    13121314
    13131315    memset(secret, 0, sizeof(secret));
    1314     rotate_secrets();
     1316    rc = rotate_secrets();
     1317    if(rc < 0)
     1318        goto fail;
     1319
    13151320    expire_buckets(s);
    13161321
    13171322    return 1;
     1323
     1324 fail:
     1325    free(buckets);
     1326    buckets = NULL;
     1327    return -1;
    13181328}
    13191329
     
    13481358
    13491359static int
    1350 leaky_bucket( void )
     1360leaky_bucket(void)
    13511361{
    13521362    if(leaky_bucket_tokens == 0) {
     
    18251835    i += delta;
    18261836
     1837#define ADD_V(buf, offset, size)                        \
     1838    if(have_v) {                                        \
     1839        COPY(buf, offset, my_v, sizeof(my_v), size);    \
     1840    }
     1841
    18271842int
    18281843send_ping(int s, struct sockaddr *sa, int salen,
     
    18361851    INC(i, rc, 512);
    18371852    COPY(buf, i, tid, tid_len, 512);
     1853    ADD_V(buf, i, 512);
    18381854    rc = snprintf(buf + i, 512 - i, "1:y1:qe"); INC(i, rc, 512);
    18391855    return sendto(s, buf, i, 0, sa, salen);
     
    18541870    rc = snprintf(buf + i, 512 - i, "e1:t%d:", tid_len); INC(i, rc, 512);
    18551871    COPY(buf, i, tid, tid_len, 512);
     1872    ADD_V(buf, i, 512);
    18561873    rc = snprintf(buf + i, 512 - i, "1:y1:re"); INC(i, rc, 512);
    18571874    return sendto(s, buf, i, 0, sa, salen);
     
    18761893    INC(i, rc, 512);
    18771894    COPY(buf, i, tid, tid_len, 512);
     1895    ADD_V(buf, i, 512);
    18781896    rc = snprintf(buf + i, 512 - i, "1:y1:qe"); INC(i, rc, 512);
    18791897    return sendto(s, buf, i, confirm ? MSG_CONFIRM : 0, sa, salen);
     
    19061924    rc = snprintf(buf + i, 2048 - i, "e1:t%d:", tid_len); INC(i, rc, 2048);
    19071925    COPY(buf, i, tid, tid_len, 2048);
     1926    ADD_V(buf, i, 2048);
    19081927    rc = snprintf(buf + i, 2048 - i, "1:y1:re"); INC(i, rc, 2048);
    19091928
     
    19491968int
    19501969send_get_peers(int s, struct sockaddr *sa, int salen,
    1951                unsigned char *tid, int tid_len,
    1952                unsigned char *infohash, unsigned short port, int confirm)
     1970               unsigned char *tid, int tid_len, unsigned char *infohash,
     1971               int confirm)
    19531972{
    19541973    char buf[512];
     
    19621981    INC(i, rc, 512);
    19631982    COPY(buf, i, tid, tid_len, 512);
     1983    ADD_V(buf, i, 512);
    19641984    rc = snprintf(buf + i, 512 - i, "1:y1:qe"); INC(i, rc, 512);
    19651985    return sendto(s, buf, i, confirm ? MSG_CONFIRM : 0, sa, salen);
     
    19902010    INC(i, rc, 512);
    19912011    COPY(buf, i, tid, tid_len, 512);
     2012    ADD_V(buf, i, 512);
    19922013    rc = snprintf(buf + i, 512 - i, "1:y1:qe"); INC(i, rc, 512);
    19932014
     
    20292050    INC(i, rc, 1400);
    20302051    COPY(buf, i, tid, tid_len, 1400);
     2052    ADD_V(buf, i, 512);
    20312053    rc = snprintf(buf + i, 2048 - i, "1:y1:re"); INC(i, rc, 2048);
    20322054    return sendto(s, buf, i, 0, sa, salen);
     
    20492071    INC(i, rc, 512);
    20502072    COPY(buf, i, tid, tid_len, 512);
     2073    ADD_V(buf, i, 2048);
    20512074    rc = snprintf(buf + i, 2048 - i, "1:y1:re"); INC(i, rc, 2048);
    20522075    return sendto(s, buf, i, 0, sa, salen);
  • trunk/third-party/dht/dht.h

    r8433 r8440  
    3232extern FILE *dht_debug;
    3333
    34 int dht_init(int s, const unsigned char *id);
     34int dht_init(int s, const unsigned char *id, const unsigned char *v);
    3535int dht_insert_node(int s, const unsigned char *id, struct sockaddr_in *sin);
    3636int dht_ping_node(int s, struct sockaddr_in *sin);
     
    5050              const void *v2, int len2,
    5151              const void *v3, int len3);
     52int dht_random_bytes(void *buf, size_t size);
Note: See TracChangeset for help on using the changeset viewer.