static char* announce_url_new (const tr_session * session, const tr_announce_request * req) { const char * str; const unsigned char * ipv6; struct evbuffer * buf = evbuffer_new (); char escaped_info_hash[SHA_DIGEST_LENGTH*3 + 1]; tr_http_escape_sha1 (escaped_info_hash, req->info_hash); evbuffer_expand (buf, 1024); evbuffer_add_printf (buf, "%s" "%c" "info_hash=%s" "&peer_id=%*.*s" "&port=%d" "&uploaded=%" PRIu64 "&downloaded=%" PRIu64 "&left=%" PRIu64 "&numwant=%d" "&key=%x" "&compact=1" "&supportcrypto=1", req->url, strchr (req->url, '?') ? '&' : '?', escaped_info_hash, PEER_ID_LEN, PEER_ID_LEN, req->peer_id, req->port, req->up, req->down, req->leftUntilComplete, req->numwant, req->key); if (session->encryptionMode == TR_ENCRYPTION_REQUIRED) evbuffer_add_printf (buf, "&requirecrypto=1"); if (req->corrupt) evbuffer_add_printf (buf, "&corrupt=%" PRIu64, req->corrupt); str = get_event_string (req); if (str && *str) evbuffer_add_printf (buf, "&event=%s", str); str = req->tracker_id_str; if (str && *str) evbuffer_add_printf (buf, "&trackerid=%s", str); /* There are two incompatible techniques for announcing an IPv6 address. BEP-7 suggests adding an "ipv6=" parameter to the announce URL, while OpenTracker requires that peers announce twice, once over IPv4 and once over IPv6. To be safe, we should do both: add the "ipv6=" parameter and announce twice. At any rate, we're already computing our IPv6 address (for the LTEP handshake), so this comes for free. */ ipv6 = tr_globalIPv6 (); if (ipv6) { char ipv6_readable[INET6_ADDRSTRLEN]; evutil_inet_ntop (AF_INET6, ipv6, ipv6_readable, INET6_ADDRSTRLEN); evbuffer_add_printf (buf, "&ipv6="); tr_http_escape (buf, ipv6_readable, -1, true); } return evbuffer_free_to_str (buf); }
int write_chunk(Stream *st, struct image *i, struct hdfile *hdfile, int include_peaks, int include_reflections, struct event* ev) { int j; char *indexer; int ret = 0; fprintf(st->fh, CHUNK_START_MARKER"\n"); fprintf(st->fh, "Image filename: %s\n", i->filename); if ( i->event != NULL ) { fprintf(st->fh, "Event: %s\n", get_event_string(i->event)); } fprintf(st->fh, "Image serial number: %i\n", i->serial); indexer = indexer_str(i->indexed_by); fprintf(st->fh, "indexed_by = %s\n", indexer); free(indexer); fprintf(st->fh, "photon_energy_eV = %f\n", J_to_eV(ph_lambda_to_en(i->lambda))); fprintf(st->fh, "beam_divergence = %.2e rad\n", i->div); fprintf(st->fh, "beam_bandwidth = %.2e (fraction)\n", i->bw); copy_hdf5_fields(hdfile, i->copyme, st->fh, ev); if ( i->det != NULL ) { int j; double tclen = 0.0; for ( j=0; j<i->det->n_panels; j++ ) { tclen += i->det->panels[j].clen; } fprintf(st->fh, "average_camera_length = %f m\n", tclen / i->det->n_panels); for ( j=0; j<i->det->n_rigid_groups; j++ ) { struct rigid_group *rg = i->det->rigid_groups[j]; if ( !rg->have_deltas ) continue; fprintf(st->fh, "rg_delta_%s_fsx = %f\n", rg->name, rg->d_fsx); fprintf(st->fh, "rg_delta_%s_ssx = %f\n", rg->name, rg->d_ssx); fprintf(st->fh, "rg_delta_%s_cnx = %f\n", rg->name, rg->d_cnx); fprintf(st->fh, "rg_delta_%s_fsy = %f\n", rg->name, rg->d_fsy); fprintf(st->fh, "rg_delta_%s_ssy = %f\n", rg->name, rg->d_ssy); fprintf(st->fh, "rg_delta_%s_cny = %f\n", rg->name, rg->d_cny); } } fprintf(st->fh, "num_peaks = %lli\n", i->num_peaks); fprintf(st->fh, "num_saturated_peaks = %lli\n", i->num_saturated_peaks); if ( include_peaks ) { if ( AT_LEAST_VERSION(st, 2, 3) ) { ret = write_peaks_2_3(i, st->fh); } else { ret = write_peaks(i, st->fh); } } for ( j=0; j<i->n_crystals; j++ ) { if ( crystal_get_user_flag(i->crystals[j]) == 0 ) { ret = write_crystal(st, i->crystals[j], include_reflections); } } fprintf(st->fh, CHUNK_END_MARKER"\n"); fflush(st->fh); return ret; }