[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
[tor-commits] r25509: {} Remove everything except the README pointing to the Git repo (torperf/trunk)
Author: kloesing
Date: 2012-03-07 09:11:48 +0000 (Wed, 07 Mar 2012)
New Revision: 25509
Removed:
torperf/trunk/LICENSE
torperf/trunk/Makefile
torperf/trunk/measurements-HOWTO
torperf/trunk/plot_results.R
torperf/trunk/run_test.py
torperf/trunk/trivsocks-client.c
torperf/trunk/util.c
torperf/trunk/util.h
Log:
Remove everything except the README pointing to the Git repo.
Deleted: torperf/trunk/LICENSE
===================================================================
--- torperf/trunk/LICENSE 2012-03-06 04:28:13 UTC (rev 25508)
+++ torperf/trunk/LICENSE 2012-03-07 09:11:48 UTC (rev 25509)
@@ -1,31 +0,0 @@
-Copyright (c) 2003 Roger Dingledine
-Copyright (c) 2004-2007 Roger Dingledine, Nick Mathewson
-Copyright (c) 2007 Roger Dingledine, Nick Mathewson, Steven J. Murdoch
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
-
- * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
-
- * Neither the names of the copyright owners nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Deleted: torperf/trunk/Makefile
===================================================================
--- torperf/trunk/Makefile 2012-03-06 04:28:13 UTC (rev 25508)
+++ torperf/trunk/Makefile 2012-03-07 09:11:48 UTC (rev 25509)
@@ -1,25 +0,0 @@
-### Copyright 2007 Steven J. Murdoch
-### See LICENSE for licensing information
-### $Id$
-
-CC=gcc -Wall -Werror -ggdb
-R=R CMD BATCH --vanilla
-IMAGES=first-download.png first-local.png first-net.png second-download.png second-local.png second-net.png
-
-all: trivsocks-client
-
-trivsocks-client: trivsocks-client.o util.o
- $(CC) -o $@ $^
-
-%.o: %.c
- $(CC) -c $<
-
-test: trivsocks-client
- ./trivsocks-client -4 tor.eff.org /
- ./trivsocks-client -5 tor.eff.org /
-
-$(IMAGES): plot_results.R
- $(R) $<
-
-clean:
- rm -f *~ *.o trivsocks-client *.png *.Rout
Deleted: torperf/trunk/measurements-HOWTO
===================================================================
--- torperf/trunk/measurements-HOWTO 2012-03-06 04:28:13 UTC (rev 25508)
+++ torperf/trunk/measurements-HOWTO 2012-03-07 09:11:48 UTC (rev 25509)
@@ -1,136 +0,0 @@
-Measuring Tor's performance as users experience it
-==================================================
-
-The performance (latency and throughput) that Tor users experience depends
-on numerous factors and is the subject of current research. In order to
-evaluate progress in improving Tor's performance, we need to continuously
-measure how fast Tor really is for our users. The primary purpose of these
-measurements is to compare how performance evolves over time. This howto
-uses a trivial SOCKS client to download files of various sizes over the Tor
-network and write down how long substeps take.
-
-The following configuration parameters are used:
-
-- 50 KB file, downloaded every 5 minutes, timeout of 4:55 minutes,
- MaxCircuitDirtiness of 1 minute, SOCKS port 9020, no entry guards
-- 1 MB file, downloaded every 30 minutes, timeout of 29:55 minutes, default
- MaxCircuitDirtiness of 10 minutes, SOCKS port 9021, no entry guards
-- 5 MB file, downloaded every 60 minutes, timeout of 59:55 minutes, default
- MaxCircuitDirtiness of 10 minutes, SOCKS port 9022, no entry guards
-
-Create sample files of correct sizes and make them available somewhere via
-http:
-
-$ dd if=/dev/urandom of=.50kbfile count=1 bs=50K
-$ dd if=/dev/urandom of=.1mbfile count=1 bs=1M
-$ dd if=/dev/urandom of=.5mbfile count=1 bs=5M
-
-These files are available as http://torperf.torproject.org/.50kbfile (and
-the other two file names). You may use these files, or you can use your
-own files instead.
-
-Check out and build torperf:
-
-$ svn co https://svn.torproject.org/svn/torperf/trunk ~/torperf
-$ cd ~/torperf
-$ make
-
-Create data directories for the Tor clients (every download uses its own
-Tor client) and write torrc files:
-
-$ mkdir torclient50kb
-$ mkdir torclient1mb
-$ mkdir torclient5mb
-
-$ cat <<EOF >> torclient50kb/torrc
-DataDirectory .
-SocksPort 9020
-MaxCircuitDirtiness 1 minute
-UseEntryGuards 0
-RunAsDaemon 1
-Log notice file log
-EOF
-
-$ cat <<EOF >> torclient1mb/torrc
-DataDirectory .
-SocksPort 9021
-UseEntryGuards 0
-RunAsDaemon 1
-Log notice file log
-EOF
-
-$ cat <<EOF >> torclient5mb/torrc
-DataDirectory .
-SocksPort 9022
-UseEntryGuards 0
-RunAsDaemon 1
-Log notice file log
-EOF
-
-Write a start script to start the Tor clients and execute it:
-
-$ cat <<EOF >> start-tors
-#!/bin/bash
-cd ~/torperf/torclient50kb && tor -f ~/torperf/torclient50kb/torrc
-cd ~/torperf/torclient1mb && tor -f ~/torperf/torclient1mb/torrc
-cd ~/torperf/torclient5mb && tor -f ~/torperf/torclient5mb/torrc
-EOF
-
-$ chmod a+x start-tors
-$ ./start-tors
-
-Install the timeout tool:
-
-$ sudo apt-get install timeout
-
-Add crontab entries to start the regular requests (line breaks are only for
-formatting purposes here):
-
-$ crontab -e
-
-*/5 * * * * timeout -2 295 ~/torperf/trivsocks-client
- torperf.torproject.org 127.0.0.1:9020 /.50kbfile >> ~/torperf/50kb.data
- 2>/dev/null
-2,32 * * * * timeout -2 1795 ~/torperf/trivsocks-client
- torperf.torproject.org 127.0.0.1:9021 /.1mbfile >> ~/torperf/1mb.data
- 2>/dev/null
-8 * * * * timeout -2 3595 ~/torperf/trivsocks-client
- torperf.torproject.org 127.0.0.1:9022 /.5mbfile >> ~/torperf/5mb.data
- 2>/dev/null
-
-From now on, the three files 50kb.data, 1mb.data, and 5mb.data should
-accumulate lines like this (50kb.data shown here; line breaks are only for
-formatting purposes):
-
-1244638801 612981
- 1244638801 612991
- 1244638801 613051
- 1244638801 613126
- 1244638801 613134
- 1244638814 282441
- 1244638814 282466
- 1244638817 164531
- 1244638826 335235
- 84 51466
-
-The column headers might be:
-
-startsec startusec
- socketsec socketusec
- connectsec connectusec
- negotiatesec negotiateusec
- requestsec requestusec
- responsesec responseusec
- datarequestsec datarequestusec
- dataresponsesec dataresponseusec
- datacompletesec datacompleteusec
- writebytes readbytes
-
-If everything works, you might want to let your system start these Tor
-clients on system startup. On Debian, this can be done using a crontab
-entry, too:
-
-$ crontab -e
-
-@reboot ~/torperf/start-tors 2>/dev/null
-
Deleted: torperf/trunk/plot_results.R
===================================================================
--- torperf/trunk/plot_results.R 2012-03-06 04:28:13 UTC (rev 25508)
+++ torperf/trunk/plot_results.R 2012-03-07 09:11:48 UTC (rev 25509)
@@ -1,143 +0,0 @@
-### Copyright 2007 Steven J. Murdoch
-### See LICENSE for licensing information
-### $Id$
-
-UFACTOR = 1e6
-
-## Subtract to timevals, maintaining precision
-todelta <- function(startsec, startusec, tsec, tusec) {
- tsec[tsec == 0] <- NA
- dsec <- tsec - startsec
- dusec <- tusec - startusec
- return(dsec*UFACTOR + dusec)
-}
-
-
-parsedata <- function(filename, size) {
-
- filename <- paste("data/run2/", filename, sep="")
-
- t = read.table(filename, header=TRUE)
-
- tStart <- t$startsec*UFACTOR + t$startusec
- dSocket <- todelta(t$startsec, t$startusec, t$socketsec, t$socketusec)
- dConnect <- todelta(t$startsec, t$startusec, t$connectsec, t$connectusec)
- dNegotiate <- todelta(t$startsec, t$startusec, t$negotiatesec, t$negotiateusec)
- dRequest <- todelta(t$startsec, t$startusec, t$requestsec, t$requestusec)
- dResponse <- todelta(t$startsec, t$startusec, t$responsesec, t$responseusec)
- dDRequest <- todelta(t$startsec, t$startusec, t$datarequestsec, t$datarequestusec)
- dDResponse <- todelta(t$startsec, t$startusec, t$dataresponsesec, t$dataresponseusec)
- dDComplete <- todelta(t$startsec, t$startusec, t$datacompletesec, t$datacompleteusec)
- cbWrite <- t$writebytes
- cbRead <- t$readbytes
-
- results <- data.frame(tStart, dSocket, dConnect,
- dNegotiate, dRequest, dResponse,
- dDRequest, dDResponse, dDComplete,
- cbWrite, cbRead)
-
- invalid <- abs(results$cbRead - size) > 64
- results[invalid,] <- NA
-
- return(results)
-}
-
-plotdist <- function(data, factor, labels, title, ylim=c(NA,NA)) {
- ## Scale units
- if (factor == 1e6)
- ylab <- "Time (s)"
- else if (factor == 1e3)
- ylab <- "Time (ms)"
- else {
- ylab <- "Time (us)"
- factor <- 1
- }
-
- d <- na.omit(data)/factor
-
- ## Find plotting range
- MinY<- NULL
- MaxY <- NULL
-
- range <- 1.5
-
- for (col in d) {
- s <- summary(col)
- Q1 <- as.vector(s[2])
- Q3 <- as.vector(s[5])
- InterQ <- Q3-Q1
- a <- Q1 - range*InterQ
- b <- Q3 + range*InterQ
-
- if (is.null(MinY) || a<MinY)
- MinY <- a
-
- if (is.null(MaxY) || b>MaxY)
- MaxY <- b
- }
-
- if (!is.na(ylim[1]))
- MinY <- ylim[1]
-
- if (!is.na(ylim[2]))
- MaxY <- ylim[2]
-
- ## Find how many points this will cause to be skipped
- skipped <- vector()
- for (i in (1:length(d))) {
- col <- d[[i]]
- isSkipped <- col<MinY | col>MaxY
- d[[i]][isSkipped] <- NA
- s <- length(which(isSkipped))
- ss <- paste("(",s,")",sep="")
- skipped <- append(skipped, ss)
- }
-
- labels <- mapply(paste, labels, skipped)
- if (length(d)>1)
- title <- paste(title, " (", length(d[[1]]), " runs)", sep="")
- else
- title <- paste(title, " (", length(d[[1]]), " runs, ", s, " skipped)", sep="")
-
- ## Plot the data
- boxplot(names=labels, d, frame.plot=FALSE, ylab=ylab, range=range,
- ylim=c(MinY, MaxY), xlab="Event (# points omitted)", main=title,
- pars=list(show.names=TRUE, boxwex = 0.8, staplewex = 0.5, outwex = 0.5))
-}
-
-first <- parsedata("first-big.data", 1048869)
-second <- parsedata("second-big.data", 1048868)
-
-EventNames <- c("start",
- "socket()", "connect()", "auth", "SOCKS req", "SOCKS resp",
- "HTTP req", "HTTP resp", "HTTP done")
-
-png("first-local.png", width=800, height=533, bg="transparent")
-par(mar=c(4.3,4.1,3.1,0.1))
-plotdist(first[2:5], 1e3, EventNames[2:5], "Local events -- first request", c(0,2))
-dev.off()
-
-png("second-local.png", width=800, height=533, bg="transparent")
-par(mar=c(4.3,4.1,5.1,0.1))
-plotdist(second[2:5], 1e3, EventNames[2:5], "Local events -- second request", c(0,2))
-dev.off()
-
-png("first-net.png", width=800, height=533, bg="transparent")
-par(mar=c(4.3,4.1,3.1,0.1))
-plotdist(first[6:8], 1e6, EventNames[6:8], "Network events -- first request", c(0,8))
-dev.off()
-
-png("second-net.png", width=800, height=533, bg="transparent")
-par(mar=c(4.3,4.1,5.1,0.1))
-plotdist(second[6:8], 1e6, EventNames[6:8], "Network events -- second request", c(0,8))
-dev.off()
-
-png("first-download.png", width=600, height=533, bg="transparent")
-par(mar=c(0.3,4.1,3.1,0.1))
-plotdist(first[9], 1e6, EventNames[9], "HTTP download -- first request", c(0,150))
-dev.off()
-
-png("second-download.png", width=600, height=533, bg="transparent")
-par(mar=c(0.3,4.1,3.1,0.1))
-plotdist(second[9], 1e6, EventNames[9], "HTTP download -- second request", c(0,150))
-dev.off()
Deleted: torperf/trunk/run_test.py
===================================================================
--- torperf/trunk/run_test.py 2012-03-06 04:28:13 UTC (rev 25508)
+++ torperf/trunk/run_test.py 2012-03-07 09:11:48 UTC (rev 25509)
@@ -1,65 +0,0 @@
-#!/usr/bin/python
-
-### Copyright 2007 Steven J. Murdoch
-### See LICENSE for licensing information
-### $Id$
-
-import os
-import time
-
-## Configuration
-
-## Files to download
-bigfile1 = ## location of big file on server 1
-smallfiler2 = ## location of a small file on server 2
-bigfile2 = ## location of a big file on server 2
-
-## Duration of a experiment
-test_duration = 15 * 60 ## Should be > 10min to ensure circuits are not re-used
-
-## Duration of a sub-experiment
-delay = test_duration/2
-
-## Main program
-
-def write_header(filename):
- ## Write file header
- fh = file(filename, "wt")
- fh.write("startsec startusec \
- socketsec socketusec \
- connectsec connectusec \
- negotiatesec negotiateusec \
- requestsec requestusec \
- responsesec responseusec \
- datarequestsec, datarequestusec \
- dataresponsesec, dataresponseusec \
- datacompletesec, datacompleteusec \
- writebytes readbytes\n")
- fh.close()
-
-write_header("first-small.data")
-write_header("first-big.data")
-write_header("second-big.data")
-
-wait = 0
-for i in range(104):
- if wait > 0:
- time.sleep(wait)
-
- one_file = (i % 2) == 0
- if one_file:
- test_type = "one file"
- else:
- test_type = "two files"
-
- print "Starting run (%s)"%test_type, i, "at", time.asctime()
-
- start = time.time()
- if one_file:
- os.system("./trivsocks-client %s %s >> first-big.data 2>/dev/null"%bigfile1)
- else:
- os.system("./trivsocks-client %s %s >> first-small.data 2>/dev/null"%smallfile2)
- os.system("./trivsocks-client %s %s >> second-big.data 2>/dev/null"%bigfile2)
-
- wait = start + delay - time.time()
- print "Finished run (%s)"%test_type, i, "at", time.asctime(), "waiting for %5f s"%wait
Deleted: torperf/trunk/trivsocks-client.c
===================================================================
--- torperf/trunk/trivsocks-client.c 2012-03-06 04:28:13 UTC (rev 25508)
+++ torperf/trunk/trivsocks-client.c 2012-03-07 09:11:48 UTC (rev 25509)
@@ -1,512 +0,0 @@
-/* Copyright 2004-2007 Roger Dingledine, Nick Mathewson */
-/* Copyright 2007 Roger Dingledine, Nick Mathewson, Steven J. Murdoch */
-/* See LICENSE for licensing information */
-/* $Id$ */
-
-#include "util.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <assert.h>
-#include <signal.h>
-
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <sys/socket.h>
-#include <sys/time.h>
-#include <sys/types.h>
-#include <errno.h>
-
-#define RESPONSE_LEN_4 8
-#define RESPONSE_LEN_5 4
-#define HTTP_BUF_LEN 256
-#define HTTP_READ_LEN 16 // Must be <= (HTTP_BUF_LEN - 1)
-
-static void usage(void) __attribute__((noreturn));
-
-
-/** Set *<b>out</b> to a newly allocated SOCKS4a resolve request with
- * <b>username</b> and <b>hostname</b> as provided. Return the number
- * of bytes in the request. */
-static int
-build_socks_connect_request(char **out,
- const char *username,
- const char *hostname,
- int reverse,
- int version)
-{
- size_t len = 0;
- assert(out);
- assert(username);
- assert(hostname);
-
- if (version == 4) {
- len = 8 + strlen(username) + 1 + strlen(hostname) + 1;
- *out = malloc(len);
- (*out)[0] = 4; /* SOCKS version 4 */
- (*out)[1] = '\x01'; /* Command: connect. */
- set_uint16((*out)+2, htons(80)); /* port: 80. */
- set_uint32((*out)+4, htonl(0x00000001u)); /* addr: 0.0.0.1 */
- memcpy((*out)+8, username, strlen(username)+1);
- memcpy((*out)+8+strlen(username)+1, hostname, strlen(hostname)+1);
- } else if (version == 5) {
- int is_ip_address;
- struct in_addr in;
- size_t addrlen;
- is_ip_address = inet_aton(hostname, &in);
- if (!is_ip_address && reverse) {
- fprintf(stderr,"Tried to do a reverse lookup on a non-IP!\n");
- return -1;
- }
- addrlen = is_ip_address ? 4 : 1 + strlen(hostname);
- len = 6 + addrlen;
- *out = malloc(len);
- (*out)[0] = 5; /* SOCKS version 5 */
- (*out)[1] = '\x01'; /* connect. */
- (*out)[2] = 0; /* reserved. */
- (*out)[3] = is_ip_address ? 1 : 3;
- if (is_ip_address) {
- set_uint32((*out)+4, in.s_addr);
- } else {
- (*out)[4] = (char)(uint8_t)(addrlen - 1);
- memcpy((*out)+5, hostname, addrlen - 1);
- }
- set_uint16((*out)+4+addrlen, htons(80)); /* port */
- } else {
- assert(0);
- }
-
- return len;
-}
-
-/** Given a <b>len</b>-byte SOCKS4a response in <b>response</b>, set
- * *<b>addr_out</b> to the address it contains (in host order).
- * Return 0 on success, -1 on error.
- */
-static int
-parse_socks4a_connect_response(const char *response, size_t len,
- uint32_t *addr_out)
-{
- uint8_t status;
- assert(response);
- assert(addr_out);
-
- if (len < RESPONSE_LEN_4) {
- fprintf(stderr, "Truncated socks response.\n");
- return -1;
- }
- if (((uint8_t)response[0])!=0) { /* version: 0 */
- fprintf(stderr, "Nonzero version in socks response: bad format.\n");
- return -1;
- }
- status = (uint8_t)response[1];
- if (get_uint16(response+2)!=0) { /* port: 0 */
- fprintf(stderr, "Nonzero port in socks response: bad format.\n");
- return -1;
- }
- fprintf(stderr, "Port number: %u\n", (unsigned)get_uint16(response+2));
- if (status != 90) {
- fprintf(stderr, "Got status response '%u': socks request failed.\n", (unsigned)status);
- return -1;
- }
-
- *addr_out = ntohl(get_uint32(response+4));
- return 0;
-}
-
-static int
-parse_socks5_connect_response(const char *response, size_t len, int s,
- uint32_t *result_addr, char **result_hostname)
-{
- char reply_buf[4];
- uint16_t port;
-
- if (len < RESPONSE_LEN_5) {
- fprintf(stderr, "Truncated socks response.\n");
- return -1;
- }
- if (response[0] != 5) {
- fprintf(stderr, "Bad SOCKS5 reply version\n");
- return -1;
- }
- if (response[1] != 0) {
- fprintf(stderr, "Got status response '%u': SOCKS5 request failed\n",
- (unsigned)response[1]);
- return -1;
- }
-
- if (response[3] == 1) {
- /* IPv4 address */
- if (read_all(s, reply_buf, 4, 1) != 4) {
- fprintf(stderr,"Error reading address in socks5 response\n");
- return -1;
- }
- *result_addr = ntohl(get_uint32(reply_buf));
- } else if (response[3] == 3) {
- size_t result_len;
- if (read_all(s, reply_buf, 1, 1) != 1) {
- fprintf(stderr,"Error reading address_length in socks5 response\n");
- return -1;
- }
- result_len = *(uint8_t*)(reply_buf);
- *result_hostname = malloc(result_len+1);
- if (read_all(s, *result_hostname, result_len, 1) != (int) result_len) {
- fprintf(stderr,"Error reading hostname in socks5 response\n");
- return -1;
- }
- (*result_hostname)[result_len] = '\0';
- }
- if (read_all(s, reply_buf, 2, 1) != 2) {
- fprintf(stderr,"Error reading port in socks5 response\n");
- return -1;
- }
- port = ntohl(get_uint16(reply_buf));
- fprintf(stderr,"Port number: %u\n", (unsigned)port);
- return 0;
-}
-
-static int
-do_socks5_negotiate(int s){
- char method_buf[2];
- if (write_all(s, "\x05\x01\x00", 3, 1) != 3) {
- perror("sending SOCKS5 method list");
- return -1;
- }
- if (read_all(s, method_buf, 2, 1) != 2) {
- perror("reading SOCKS5 methods");
- return -1;
- }
- if (method_buf[0] != '\x05') {
- perror("unrecognized SOCKS version");
- return -1;
- }
- if (method_buf[1] != '\x00') {
- perror("unrecognized socks authentication method");
- return -1;
- }
- return 0;
-}
-
-int
-do_http_get(int s, const char *path, const char *hostname, size_t *read_bytes, size_t *write_bytes,
- struct timeval *datarequesttime,
- struct timeval *dataresponsetime,
- struct timeval *datacompletetime) {
- char buf[HTTP_BUF_LEN];
- int len; // Length of request, not including \0
- char is_first = 1;
-
- len = snprintf(buf, HTTP_BUF_LEN, "GET %s HTTP/1.0\r\nPragma: no-cache\r\n"
- "Host: %s\r\n\r\n", path, hostname);
-
- // Check for overflow or error
- if (len >= HTTP_BUF_LEN || len < 0)
- return -1;
-
- // Write the request
- fprintf(stderr, "Response: %s\n", buf);
- if (write_all(s, buf, len, 1) != len)
- return -1;
- *write_bytes = len;
- // Get when request is sent
- if (gettimeofday(datarequesttime, NULL)) {
- perror("getting datarequesttime");
- return -1;
- }
-
- // Half-close the socket
- //if (shutdown(s, SHUT_WR))
- // return -1;
-
- // Default, in case no data is returned
- dataresponsetime -> tv_sec = dataresponsetime -> tv_usec = 0;
-
- // Read the response
- *read_bytes = 0;
- while ((len = read_all(s, buf, HTTP_READ_LEN, 1)) > 0) {
- buf[len] = '\0';
- fprintf(stderr, "Response: %s\n", buf);
- *read_bytes += len;
- // Get when start of response was received
- if (is_first) {
- is_first = 0;
- if (gettimeofday(dataresponsetime, NULL)) {
- perror("getting dataresponsetime");
- return -1;
- }
- }
- }
-
- // Get when response is complete
- if (gettimeofday(datacompletetime, NULL)) {
- perror("getting datacompletetime");
- return -1;
- }
-
- return len;
-}
-
-static int
-print_time(struct timeval t) {
- return printf("%ld %ld ", t.tv_sec, t.tv_usec);
-}
-
-// Timestamps of important events
-struct timeval starttime; // Connection process started
-struct timeval sockettime; // After socket is created
-struct timeval connecttime; // After socket is connected
-struct timeval negotiatetime; // After authentication methods are negotiated (SOCKS 5 only)
-struct timeval requesttime; // After SOCKS request is sent
-struct timeval responsetime; // After SOCKS response is received
-struct timeval datarequesttime; // After HTTP request is written
-struct timeval dataresponsetime; // After first response is received
-struct timeval datacompletetime; // After payload is complete
-
-// Data counters of SOCKS payload
-size_t read_bytes;
-size_t write_bytes;
-
-static void
-output_status_information(void)
-{
- print_time(starttime);
- print_time(sockettime);
- print_time(connecttime);
- print_time(negotiatetime);
- print_time(requesttime);
- print_time(responsetime);
- print_time(datarequesttime);
- print_time(dataresponsetime);
- print_time(datacompletetime);
-
- printf("%lu %lu\n", (unsigned long)write_bytes, (unsigned long)read_bytes);
-}
-
-/** Send a resolve request for <b>hostname</b> to the Tor listening on
- * <b>sockshost</b>:<b>socksport</b>. Store the resulting IPv4
- * address (in host order) into *<b>result_addr</b>.
- */
-static int
-do_connect(const char *hostname, const char *filename, uint32_t sockshost, uint16_t socksport,
- int reverse, int version,
- uint32_t *result_addr, char **result_hostname)
-{
-
- int s;
- struct sockaddr_in socksaddr;
- char *req = NULL;
- int len = 0;
- int retval;
-
- assert(hostname);
- assert(filename);
- assert(result_addr);
- assert(version == 4 || version == 5);
-
- *result_addr = 0;
- *result_hostname = NULL;
-
- // Get time that connection was started
- if (gettimeofday(&starttime, NULL)) {
- perror("getting starttime");
- return -1;
- }
-
- // Create the socket for connecting to SOCKS server
- s = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);
- if (s<0) {
- perror("creating socket");
- return -1;
- }
- // Get time that socket was created
- if (gettimeofday(&sockettime, NULL)) {
- perror("getting sockettime");
- return -1;
- }
-
- // Connect to the SOCKS server
- memset(&socksaddr, 0, sizeof(socksaddr));
- socksaddr.sin_family = AF_INET;
- socksaddr.sin_port = htons(socksport);
- socksaddr.sin_addr.s_addr = htonl(sockshost);
- if (connect(s, (struct sockaddr*)&socksaddr, sizeof(socksaddr))) {
- perror("connecting to SOCKS host");
- return -1;
- }
- // Get time that socket was connected
- if (gettimeofday(&connecttime, NULL)) {
- perror("getting connecttime");
- return -1;
- }
-
- // Negotiate authentication method for SOCKS 5
- if (version == 5) {
- retval = do_socks5_negotiate(s);
- if (retval)
- return retval;
- }
- // Get time that negotiation was completed
- if (gettimeofday(&negotiatetime, NULL)) {
- perror("getting negotiatetime");
- return -1;
- }
-
- if ((len = build_socks_connect_request(&req, "", hostname, reverse,
- version))<0) {
- fprintf(stderr, "error generating SOCKS request: %d\n", len);
- return -1;
- }
- if (write_all(s, req, len, 1) != len) {
- perror("sending SOCKS request");
- free(req);
- return -1;
- }
- free(req);
- // Get time that request was sent
- if (gettimeofday(&requesttime, NULL)) {
- perror("getting requesttime");
- return -1;
- }
-
- if (version == 4) {
- char reply_buf[RESPONSE_LEN_4];
- if (read_all(s, reply_buf, RESPONSE_LEN_4, 1) != RESPONSE_LEN_4) {
- fprintf(stderr, "Error reading SOCKS4 response.\n");
- return -1;
- }
- if (parse_socks4a_connect_response(reply_buf, RESPONSE_LEN_4,
- result_addr)<0){
- return -1;
- }
- } else {
- char reply_buf[RESPONSE_LEN_5];
- if (read_all(s, reply_buf, RESPONSE_LEN_5, 1) != RESPONSE_LEN_5) {
- fprintf(stderr, "Error reading SOCKS5 response\n");
- return -1;
- }
- if (parse_socks5_connect_response(reply_buf, RESPONSE_LEN_5, s,
- result_addr, result_hostname)<0){
- return -1;
- }
- }
- // Get time that response was received
- if (gettimeofday(&responsetime, NULL)) {
- perror("getting responsetime");
- return -1;
- }
-
- /*
- char reply_buf[1];
- while (read_all(s, reply_buf, 1, 1) != 0) {
- fprintf(stderr,"Extra data: 0x%x\n", reply_buf[0]);
- }
- */
-
- // Request a file using HTTP
- do_http_get(s, filename, hostname, &read_bytes, &write_bytes,
- &datarequesttime, &dataresponsetime, &datacompletetime);
-
- // Output status information
- output_status_information();
-
- return 0;
-}
-
-/** Print a usage message and exit. */
-static void
-usage(void)
-{
- puts("Syntax: trivsocks-client hostname [sockshost:socksport] /path/to/file");
- exit(1);
-}
-
-static void
-termination_handler(int signum)
-{
- fprintf(stderr,"Received a timeout. Exiting.\n");
- output_status_information();
-
- exit(1);
-}
-
-/** Entry point to tor-resolve */
-int
-main(int argc, char **argv)
-{
- uint32_t sockshost;
- uint16_t socksport;
- int isSocks4 = 0, isVerbose = 0, isReverse = 0, force = 0;
- char **arg;
- int n_args;
- uint32_t result = 0;
- char *result_hostname = NULL;
- char *hostname = NULL, *filename = NULL;
-
- signal(SIGINT, termination_handler);
-
- arg = &argv[1];
- n_args = argc-1;
-
- if (!n_args)
- usage();
-
- if (!strcmp(arg[0],"--version")) {
- printf("Tor version 0.1\n");
- return 0;
- }
-
- while (n_args && *arg[0] == '-') {
- if (!strcmp("-v", arg[0]))
- isVerbose = 1;
- else if (!strcmp("-4", arg[0]))
- isSocks4 = 1;
- else if (!strcmp("-5", arg[0]))
- isSocks4 = 0;
- else if (!strcmp("-x", arg[0]))
- isReverse = 1;
- else if (!strcmp("-F", arg[0]))
- force = 1;
- else {
- fprintf(stderr, "Unrecognized flag '%s'\n", arg[0]);
- usage();
- }
- ++arg;
- --n_args;
- }
-
- if (isSocks4 && isReverse) {
- fprintf(stderr, "Reverse lookups not supported with SOCKS4a\n");
- usage();
- }
-
- if (n_args == 2) {
- fprintf(stderr,"defaulting to localhost:9050\n");
- sockshost = 0x7f000001u; /* localhost */
- socksport = 9050; /* 9050 */
- hostname = arg[0];
- filename = arg[1];
- } else if (n_args == 3) {
- if (parse_addr_port(0, arg[1], NULL, &sockshost, &socksport)<0) {
- fprintf(stderr, "Couldn't parse/resolve address %s\n", arg[1]);
- return 1;
- }
- if (socksport == 0) {
- fprintf(stderr,"defaulting to port 9050\n");
- socksport = 9050;
- }
- hostname = arg[0];
- filename = arg[2];
- } else {
- usage();
- }
-
- if (do_connect(hostname, filename, sockshost, socksport,
- isReverse, isSocks4 ? 4 : 5, &result,
- &result_hostname))
- return 1;
-
- return 0;
-}
-
Deleted: torperf/trunk/util.c
===================================================================
--- torperf/trunk/util.c 2012-03-06 04:28:13 UTC (rev 25508)
+++ torperf/trunk/util.c 2012-03-07 09:11:48 UTC (rev 25509)
@@ -1,260 +0,0 @@
-/* Copyright 2003 Roger Dingledine
- * Copyright 2004-2007 Roger Dingledine, Nick Mathewson
- * Copyright 2007 Roger Dingledine, Nick Mathewson, Steven J. Murdoch */
-/* See LICENSE for licensing information */
-/* $Id$ */
-
-/**
- * Utility functions (based on src/common/util.c from Tor)
- */
-
-#define _GNU_SOURCE
-
-#include "util.h"
-
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <unistd.h>
-#include <stdint.h>
-#include <assert.h>
-#include <string.h>
-#include <netdb.h>
-#include <stdio.h>
-
-#define SIZE_T_CEILING (sizeof(char)<<(sizeof(size_t)*8 - 1))
-
-/** Write <b>count</b> bytes from <b>buf</b> to <b>fd</b>. <b>isSocket</b>
- * must be 1 if fd was returned by socket() or accept(), and 0 if fd
- * was returned by open(). Return the number of bytes written, or -1
- * on error. Only use if fd is a blocking fd. */
-int
-write_all(int fd, const char *buf, size_t count, int isSocket)
-{
- size_t written = 0;
- int result;
-
- while (written != count) {
- if (isSocket)
- result = send(fd, buf+written, count-written, 0);
- else
- result = write(fd, buf+written, count-written);
- if (result<0)
- return -1;
- written += result;
- }
- return count;
-}
-
-/** Read from <b>fd</b> to <b>buf</b>, until we get <b>count</b> bytes
- * or reach the end of the file. <b>isSocket</b> must be 1 if fd
- * was returned by socket() or accept(), and 0 if fd was returned by
- * open(). Return the number of bytes read, or -1 on error. Only use
- * if fd is a blocking fd. */
-int
-read_all(int fd, char *buf, size_t count, int isSocket)
-{
- size_t numread = 0;
- int result;
-
- if (count > SIZE_T_CEILING)
- return -1;
-
- while (numread != count) {
- if (isSocket)
- result = recv(fd, buf+numread, count-numread, 0);
- else
- result = read(fd, buf+numread, count-numread);
- if (result<0)
- return -1;
- else if (result == 0)
- break;
- numread += result;
- }
- return numread;
-}
-
-/**
- * Read a 16-bit value beginning at <b>cp</b>. Equivalent to
- * *(uint16_t*)(cp), but will not cause segfaults on platforms that forbid
- * unaligned memory access.
- */
-uint16_t
-get_uint16(const char *cp)
-{
- uint16_t v;
- memcpy(&v,cp,2);
- return v;
-}
-/**
- * Read a 32-bit value beginning at <b>cp</b>. Equivalent to
- * *(uint32_t*)(cp), but will not cause segfaults on platforms that forbid
- * unaligned memory access.
- */
-uint32_t
-get_uint32(const char *cp)
-{
- uint32_t v;
- memcpy(&v,cp,4);
- return v;
-}
-/**
- * Set a 16-bit value beginning at <b>cp</b> to <b>v</b>. Equivalent to
- * *(uint16_t)(cp) = v, but will not cause segfaults on platforms that forbid
- * unaligned memory access. */
-void
-set_uint16(char *cp, uint16_t v)
-{
- memcpy(cp,&v,2);
-}
-/**
- * Set a 32-bit value beginning at <b>cp</b> to <b>v</b>. Equivalent to
- * *(uint32_t)(cp) = v, but will not cause segfaults on platforms that forbid
- * unaligned memory access. */
-void
-set_uint32(char *cp, uint32_t v)
-{
- memcpy(cp,&v,4);
-}
-
-/* Helper: common code to check whether the result of a strtol or strtoul or
- * strtoll is correct. */
-#define CHECK_STRTOX_RESULT() \
- /* Was at least one character converted? */ \
- if (endptr == s) \
- goto err; \
- /* Were there unexpected unconverted characters? */ \
- if (!next && *endptr) \
- goto err; \
- /* Is r within limits? */ \
- if (r < min || r > max) \
- goto err; \
- if (ok) *ok = 1; \
- if (next) *next = endptr; \
- return r; \
- err: \
- if (ok) *ok = 0; \
- if (next) *next = endptr; \
- return 0
-
-/** Extract a long from the start of s, in the given numeric base. If
- * there is unconverted data and next is provided, set *next to the
- * first unconverted character. An error has occurred if no characters
- * are converted; or if there are unconverted characters and next is NULL; or
- * if the parsed value is not between min and max. When no error occurs,
- * return the parsed value and set *ok (if provided) to 1. When an error
- * occurs, return 0 and set *ok (if provided) to 0.
- */
-long
-parse_long(const char *s, int base, long min, long max,
- int *ok, char **next)
-{
- char *endptr;
- long r;
-
- r = strtol(s, &endptr, base);
- CHECK_STRTOX_RESULT();
-}
-
-/** Similar behavior to Unix gethostbyname: resolve <b>name</b>, and set
- * *<b>addr</b> to the proper IP address, in host byte order. Returns 0
- * on success, -1 on failure; 1 on transient failure.
- *
- * (This function exists because standard windows gethostbyname
- * doesn't treat raw IP addresses properly.)
- */
-int
-lookup_hostname(const char *name, uint32_t *addr)
-{
- struct hostent *hp;
- struct in_addr* myaddr;
-
- if ((hp = gethostbyname(name)) == NULL)
- return -1;
-
- if (hp->h_addrtype != AF_INET)
- return -1;
-
- myaddr = (struct in_addr*)(hp -> h_addr_list[0]);
-
- if (myaddr == NULL)
- return -1;
-
- *addr = ntohl(myaddr -> s_addr);
-
- return 0;
-}
-
-/** Parse a string of the form "host[:port]" from <b>addrport</b>. If
- * <b>address</b> is provided, set *<b>address</b> to a copy of the
- * host portion of the string. If <b>addr</b> is provided, try to
- * resolve the host portion of the string and store it into
- * *<b>addr</b> (in host byte order). If <b>port_out</b> is provided,
- * store the port number into *<b>port_out</b>, or 0 if no port is given.
- * If <b>port_out</b> is NULL, then there must be no port number in
- * <b>addrport</b>.
- * Return 0 on success, -1 on failure.
- */
-int
-parse_addr_port(int severity, const char *addrport, char **address,
- uint32_t *addr, uint16_t *port_out)
-{
- const char *colon;
- char *_address = NULL;
- int _port;
- int ok = 1;
-
- assert(addrport);
-
- colon = strchr(addrport, ':');
- if (colon) {
- _address = strndup(addrport, colon-addrport);
- _port = (int) parse_long(colon+1,10,1,65535,NULL,NULL);
- if (!_port) {
- fprintf(stderr, "Port %s out of range\n", colon+1);
- ok = 0;
- }
- if (!port_out) {
- fprintf(stderr, "Port %s given on %s when not required\n",
- colon+1, addrport);
- ok = 0;
- }
- } else {
- _address = strdup(addrport);
- _port = 0;
- }
-
- if (addr) {
- /* There's an addr pointer, so we need to resolve the hostname. */
- if (lookup_hostname(_address,addr)) {
- fprintf(stderr, "Couldn't look up %s\n", _address);
- ok = 0;
- *addr = 0;
- }
- }
-
- if (address && ok) {
- *address = _address;
- } else {
- if (address)
- *address = NULL;
- free(_address);
- }
- if (port_out)
- *port_out = ok ? ((uint16_t) _port) : 0;
-
- return ok ? 0 : -1;
-}
-
-/** Compares the last strlen(s2) characters of s1 with s2. Returns as for
- * strcasecmp.
- */
-int
-strcasecmpend(const char *s1, const char *s2)
-{
- size_t n1 = strlen(s1), n2 = strlen(s2);
- if (n2>n1) /* then they can't be the same; figure out which is bigger */
- return strcasecmp(s1,s2);
- else
- return strncasecmp(s1+(n1-n2), s2, n2);
-}
-
Deleted: torperf/trunk/util.h
===================================================================
--- torperf/trunk/util.h 2012-03-06 04:28:13 UTC (rev 25508)
+++ torperf/trunk/util.h 2012-03-07 09:11:48 UTC (rev 25509)
@@ -1,35 +0,0 @@
-/* Copyright 2003 Roger Dingledine
- * Copyright 2004-2007 Roger Dingledine, Nick Mathewson
- * Copyright 2007 Roger Dingledine, Nick Mathewson, Steven J. Murdoch */
-/* See LICENSE for licensing information */
-/* $Id$ */
-
-/**
- * Utility functions (based on src/common/util.h from Tor)
- */
-
-#ifndef UTIL_H
-#define UTIL_H
-
-#include <stdlib.h>
-#include <stdint.h>
-
-#define INET_NTOA_BUF_LEN 16 /* 255.255.255.255 */
-
-int write_all(int fd, const char *buf, size_t count, int isSocket);
-int read_all(int fd, char *buf, size_t count, int isSocket);
-
-uint16_t get_uint16(const char *cp);
-uint32_t get_uint32(const char *cp);
-void set_uint16(char *cp, uint16_t v);
-void set_uint32(char *cp, uint32_t v);
-
-int parse_addr_port(int severity, const char *addrport, char **address,
- uint32_t *addr, uint16_t *port_out);
-
-long parse_long(const char *s, int base, long min, long max,
- int *ok, char **next);
-
-int strcasecmpend(const char *s1, const char *s2);
-
-#endif // !UTIL_H
_______________________________________________
tor-commits mailing list
tor-commits@xxxxxxxxxxxxxxxxxxxx
https://lists.torproject.org/cgi-bin/mailman/listinfo/tor-commits