Index: uspace/app/nettest1/nettest1.c
===================================================================
--- uspace/app/nettest1/nettest1.c	(revision 3d459fcecedd05c16f0147a90e81b3f544b21bc3)
+++ uspace/app/nettest1/nettest1.c	(revision 69e0d6d76d229cc73c6c8a11802d5f2e93167ca4)
@@ -44,5 +44,4 @@
 #include <time.h>
 #include <arg_parse.h>
-#include <err.h>
 
 #include <net/in.h>
@@ -58,152 +57,274 @@
 #define NETTEST1_TEXT	"Networking test 1 - sockets"
 
+static int family = PF_INET;
+static sock_type_t type = SOCK_DGRAM;
+static char *data;
+static size_t size = 27;
+static int verbose = 0;
+
+static struct sockaddr *address;
+static socklen_t addrlen;
+
+static int sockets;
+static int messages;
+static uint16_t port;
+
 static void nettest1_print_help(void)
 {
 	printf(
-		"Network Networking test 1 aplication - sockets\n" \
-		"Usage: echo [options] numeric_address\n" \
-		"Where options are:\n" \
-		"-f protocol_family | --family=protocol_family\n" \
-		"\tThe listenning socket protocol family. Only the PF_INET and PF_INET6 are supported.\n"
-		"\n" \
-		"-h | --help\n" \
-		"\tShow this application help.\n"
-		"\n" \
-		"-m count | --messages=count\n" \
-		"\tThe number of messages to send and receive per socket. The default is 10.\n" \
-		"\n" \
-		"-n sockets | --sockets=count\n" \
-		"\tThe number of sockets to use. The default is 10.\n" \
-		"\n" \
-		"-p port_number | --port=port_number\n" \
-		"\tThe port number the application should send messages to. The default is 7.\n" \
-		"\n" \
-		"-s packet_size | --size=packet_size\n" \
-		"\tThe packet data size the application sends. The default is 28 bytes.\n" \
-		"\n" \
-		"-v | --verbose\n" \
-		"\tShow all output messages.\n"
-	);
+	    "Network Networking test 1 aplication - sockets\n"
+	    "Usage: echo [options] numeric_address\n"
+	    "Where options are:\n"
+	    "-f protocol_family | --family=protocol_family\n"
+	    "\tThe listenning socket protocol family. Only the PF_INET and "
+	    "PF_INET6 are supported.\n"
+	    "\n"
+	    "-h | --help\n"
+	    "\tShow this application help.\n"
+	    "\n"
+	    "-m count | --messages=count\n"
+	    "\tThe number of messages to send and receive per socket. The "
+	    "default is 10.\n"
+	    "\n"
+	    "-n sockets | --sockets=count\n"
+	    "\tThe number of sockets to use. The default is 10.\n"
+	    "\n"
+	    "-p port_number | --port=port_number\n"
+	    "\tThe port number the application should send messages to. The "
+	    "default is 7.\n"
+	    "\n"
+	    "-s packet_size | --size=packet_size\n"
+	    "\tThe packet data size the application sends. The default is "
+	    "28 bytes.\n"
+	    "\n"
+	    "-v | --verbose\n"
+	    "\tShow all output messages.\n");
 }
 
-/** Refreshes the data.
+/** Parse one command-line option.
  *
- * Fills the data block with the NETTEST1_TEXT pattern.
- *
- * @param[out] data The data block.
- * @param[in] size The data block size in bytes.
- */
-static void nettest1_refresh_data(char *data, size_t size)
+ * @param argc		Number of all command-line arguments.
+ * @param argv		All command-line arguments.
+ * @param index		Current argument index (in, out).
+ */
+static int nettest1_parse_opt(int argc, char *argv[], int *index)
 {
-	size_t length;
-
-	// fill the data
-	length = 0;
-	while (size > length + sizeof(NETTEST1_TEXT) - 1) {
-		memcpy(data + length, NETTEST1_TEXT, sizeof(NETTEST1_TEXT) - 1);
-		length += sizeof(NETTEST1_TEXT) - 1;
-	}
-	memcpy(data + length, NETTEST1_TEXT, size - length);
-	data[size] = '\0';
-}
-
-
-int main(int argc, char *argv[])
-{
-	ERROR_DECLARE;
-
-	size_t size = 27;
-	int verbose = 0;
-	sock_type_t type = SOCK_DGRAM;
-	int sockets = 10;
-	int messages = 10;
-	int family = PF_INET;
-	uint16_t port = 7;
-
-	socklen_t max_length = sizeof(struct sockaddr_in6);
-	uint8_t address_data[max_length];
-	struct sockaddr *address = (struct sockaddr *) address_data;
-	struct sockaddr_in *address_in = (struct sockaddr_in *) address;
-	struct sockaddr_in6 *address_in6 = (struct sockaddr_in6 *) address;
-	socklen_t addrlen;
-	uint8_t *address_start;
-
-	int *socket_ids;
-	char *data;
 	int value;
-	int index;
-	struct timeval time_before;
-	struct timeval time_after;
-
-	// parse the command line arguments
-	// stop before the last argument if it does not start with the minus sign ('-')
-	for (index = 1; (index < argc - 1) || ((index == argc - 1) && (argv[index][0] == '-')); index++) {
-		// options should start with the minus sign ('-')
-		if (argv[index][0] == '-') {
-			switch (argv[index][1]) {
-			// short options with only one letter
-			case 'f':
-				ERROR_PROPAGATE(arg_parse_name_int(argc, argv, &index, &family, 0, socket_parse_protocol_family));
-				break;
-			case 'h':
-				nettest1_print_help();
-				return EOK;
-				break;
-			case 'm':
-				ERROR_PROPAGATE(arg_parse_int(argc, argv, &index, &messages, 0));
-				break;
-			case 'n':
-				ERROR_PROPAGATE(arg_parse_int(argc, argv, &index, &sockets, 0));
-				break;
-			case 'p':
-				ERROR_PROPAGATE(arg_parse_int(argc, argv, &index, &value, 0));
-				port = (uint16_t) value;
-				break;
-			case 's':
-				ERROR_PROPAGATE(arg_parse_int(argc, argv, &index, &value, 0));
-				size = (value >= 0) ? (size_t) value : 0;
-				break;
-			case 't':
-				ERROR_PROPAGATE(arg_parse_name_int(argc, argv, &index, &value, 0, socket_parse_socket_type));
-				type = (sock_type_t) value;
-				break;
-			case 'v':
-				verbose = 1;
-				break;
-			// long options with the double minus sign ('-')
-			case '-':
-				if (str_lcmp(argv[index] + 2, "family=", 7) == 0) {
-					ERROR_PROPAGATE(arg_parse_name_int(argc, argv, &index, &family, 9, socket_parse_protocol_family));
-				} else if (str_lcmp(argv[index] + 2, "help", 5) == 0) {
-					nettest1_print_help();
-					return EOK;
-				} else if (str_lcmp(argv[index] + 2, "messages=", 6) == 0) {
-					ERROR_PROPAGATE(arg_parse_int(argc, argv, &index, &messages, 8));
-				} else if (str_lcmp(argv[index] + 2, "sockets=", 6) == 0) {
-					ERROR_PROPAGATE(arg_parse_int(argc, argv, &index, &sockets, 8));
-				} else if (str_lcmp(argv[index] + 2, "port=", 5) == 0) {
-					ERROR_PROPAGATE(arg_parse_int(argc, argv, &index, &value, 7));
-					port = (uint16_t) value;
-				} else if (str_lcmp(argv[index] + 2, "type=", 5) == 0) {
-					ERROR_PROPAGATE(arg_parse_name_int(argc, argv, &index, &value, 7, socket_parse_socket_type));
-					type = (sock_type_t) value;
-				} else if (str_lcmp(argv[index] + 2, "verbose", 8) == 0) {
-					verbose = 1;
-				} else {
-					nettest1_print_help();
-					return EINVAL;
-				}
-				break;
-			default:
-				nettest1_print_help();
-				return EINVAL;
-			}
+	int rc;
+
+	switch (argv[*index][1]) {
+	/*
+	 * Short options with only one letter
+	 */
+	case 'f':
+		rc = arg_parse_name_int(argc, argv, index, &family, 0, socket_parse_protocol_family);
+		if (rc != EOK)
+			return rc;
+		break;
+	case 'h':
+		nettest1_print_help();
+		return EOK;
+	case 'm':
+		rc = arg_parse_int(argc, argv, index, &messages, 0);
+		if (rc != EOK)
+			return rc;
+		break;
+	case 'n':
+		rc = arg_parse_int(argc, argv, index, &sockets, 0);
+		if (rc != EOK)
+			return rc;
+		break;
+	case 'p':
+		rc = arg_parse_int(argc, argv, index, &value, 0);
+		if (rc != EOK)
+			return rc;
+		port = (uint16_t) value;
+		break;
+	case 's':
+		rc = arg_parse_int(argc, argv, index, &value, 0);
+		if (rc != EOK)
+			return rc;
+		size = (value >= 0) ? (size_t) value : 0;
+		break;
+	case 't':
+		rc = arg_parse_name_int(argc, argv, index, &value, 0, socket_parse_socket_type);
+		if (rc != EOK)
+			return rc;
+		type = (sock_type_t) value;
+		break;
+	case 'v':
+		verbose = 1;
+		break;
+	/*
+	 * Long options with double dash ('-')
+	 */
+	case '-':
+		if (str_lcmp(argv[*index] + 2, "family=", 7) == 0) {
+			rc = arg_parse_name_int(argc, argv, index, &family, 9,
+			    socket_parse_protocol_family);
+			if (rc != EOK)
+				return rc;
+		} else if (str_lcmp(argv[*index] + 2, "help", 5) == 0) {
+			nettest1_print_help();
+			return EOK;
+		} else if (str_lcmp(argv[*index] + 2, "messages=", 6) == 0) {
+			rc = arg_parse_int(argc, argv, index, &messages, 8);
+			if (rc != EOK)
+				return rc;
+		} else if (str_lcmp(argv[*index] + 2, "sockets=", 6) == 0) {
+			rc = arg_parse_int(argc, argv, index, &sockets, 8);
+			if (rc != EOK)
+				return rc;
+		} else if (str_lcmp(argv[*index] + 2, "port=", 5) == 0) {
+			rc = arg_parse_int(argc, argv, index, &value, 7);
+			if (rc != EOK)
+				return rc;
+			port = (uint16_t) value;
+		} else if (str_lcmp(argv[*index] + 2, "type=", 5) == 0) {
+			rc = arg_parse_name_int(argc, argv, index, &value, 7,
+			    socket_parse_socket_type);
+			if (rc != EOK)
+				return rc;
+			type = (sock_type_t) value;
+		} else if (str_lcmp(argv[*index] + 2, "verbose", 8) == 0) {
+			verbose = 1;
 		} else {
 			nettest1_print_help();
 			return EINVAL;
 		}
-	}
-
-	// if not before the last argument containing the address
+		break;
+	default:
+		nettest1_print_help();
+		return EINVAL;
+	}
+
+	return EOK;
+}
+
+/** Fill buffer with the NETTEST1_TEXT pattern.
+ *
+ * @param buffer	Data buffer.
+ * @param size		Buffer size in bytes.
+ */
+static void nettest1_fill_buffer(char *buffer, size_t size)
+{
+	size_t length;
+
+	length = 0;
+	while (size > length + sizeof(NETTEST1_TEXT) - 1) {
+		memcpy(buffer + length, NETTEST1_TEXT,
+		    sizeof(NETTEST1_TEXT) - 1);
+		length += sizeof(NETTEST1_TEXT) - 1;
+	}
+
+	memcpy(buffer + length, NETTEST1_TEXT, size - length);
+	buffer[size] = '\0';
+}
+
+static int nettest1_test(int *socket_ids, int nsockets, int nmessages)
+{
+	int rc;
+
+	if (verbose)
+		printf("%d sockets, %d messages\n", nsockets, nmessages);
+
+	rc = sockets_create(verbose, socket_ids, nsockets, family, type);
+	if (rc != EOK)
+		return rc;
+
+	if (type == SOCK_STREAM) {
+		rc = sockets_connect(verbose, socket_ids, nsockets, address,
+		    addrlen);
+		if (rc != EOK)
+			return rc;
+	}
+
+	rc = sockets_sendto_recvfrom(verbose, socket_ids, nsockets, address,
+	    &addrlen, data, size, nmessages);
+	if (rc != EOK)
+		return rc;
+
+	rc = sockets_close(verbose, socket_ids, nsockets);
+	if (rc != EOK)
+		return rc;
+
+	if (verbose)
+		printf("\tOK\n");
+
+	/****/
+
+	rc = sockets_create(verbose, socket_ids, nsockets, family, type);
+	if (rc != EOK)
+		return rc;
+
+	if (type == SOCK_STREAM) {
+		rc = sockets_connect(verbose, socket_ids, nsockets, address,
+		    addrlen);
+		if (rc != EOK)
+			return rc;
+	}
+
+	rc = sockets_sendto(verbose, socket_ids, nsockets, address, addrlen,
+	    data, size, nmessages);
+	if (rc != EOK)
+		return rc;
+
+	rc = sockets_recvfrom(verbose, socket_ids, nsockets, address, &addrlen,
+	    data, size, nmessages);
+	if (rc != EOK)
+		return rc;
+
+	rc = sockets_close(verbose, socket_ids, nsockets);
+	if (rc != EOK)
+		return rc;
+
+	if (verbose)
+		printf("\tOK\n");
+
+	return EOK;
+}
+
+int main(int argc, char *argv[])
+{
+
+	socklen_t max_length;
+	uint8_t *address_data[sizeof(struct sockaddr_in6)];
+	struct sockaddr_in *address_in;
+	struct sockaddr_in6 *address_in6;
+	uint8_t *address_start;
+
+	int *socket_ids;
+	int index;
+	struct timeval time_before;
+	struct timeval time_after;
+
+	int rc;
+
+	max_length = sizeof(address_data);
+	address = (struct sockaddr *) address_data;
+	address_in = (struct sockaddr_in *) address;
+	address_in6 = (struct sockaddr_in6 *) address;
+
+	sockets = 10;
+	messages = 10;
+	port = 7;
+
+	/*
+	 * Parse the command line arguments. Stop before the last argument
+	 * if it does not start with dash ('-')
+	 */
+	for (index = 1; (index < argc - 1) || ((index == argc - 1) && (argv[index][0] == '-')); index++) {
+		/* Options should start with dash ('-') */
+		if (argv[index][0] == '-') {
+			rc = nettest1_parse_opt(argc, argv, &index);
+			if (rc != EOK)
+				return rc;
+		} else {
+			nettest1_print_help();
+			return EINVAL;
+		}
+	}
+
+	/* If not before the last argument containing the address */
 	if (index >= argc) {
 		printf("Command line error: missing address\n");
@@ -212,6 +333,7 @@
 	}
 
-	// prepare the address buffer
+	/* Prepare the address buffer */
 	bzero(address_data, max_length);
+
 	switch (family) {
 	case PF_INET:
@@ -232,18 +354,22 @@
 	}
 
-	// parse the last argument which should contain the address
-	if (ERROR_OCCURRED(inet_pton(family, argv[argc - 1], address_start))) {
-		fprintf(stderr, "Address parse error %d\n", ERROR_CODE);
-		return ERROR_CODE;
-	}
-
-	// check the buffer size
+	/* Parse the last argument which should contain the address */
+	rc = inet_pton(family, argv[argc - 1], address_start);
+	if (rc != EOK) {
+		fprintf(stderr, "Address parse error %d\n", rc);
+		return rc;
+	}
+
+	/* Check data buffer size */
 	if (size <= 0) {
-		fprintf(stderr, "Data buffer size too small (%d). Using 1024 bytes instead.\n", size);
+		fprintf(stderr, "Data buffer size too small (%d). Using 1024 "
+		    "bytes instead.\n", size);
 		size = 1024;
 	}
 
-	// prepare the buffer
-	// size plus the terminating null (\0)
+	/*
+	 * Prepare data buffer. Allocate size bytes plus one for the
+	 * trailing null character.
+	 */
 	data = (char *) malloc(size + 1);
 	if (!data) {
@@ -251,14 +377,17 @@
 		return ENOMEM;
 	}
-	nettest1_refresh_data(data, size);
-
-	// check the socket count
+	nettest1_fill_buffer(data, size);
+
+	/* Check socket count */
 	if (sockets <= 0) {
-		fprintf(stderr, "Socket count too small (%d). Using 2 instead.\n", sockets);
+		fprintf(stderr, "Socket count too small (%d). Using "
+		    "2 instead.\n", sockets);
 		sockets = 2;
 	}
 
-	// prepare the socket buffer
-	// count plus the terminating null (\0)
+	/*
+	 * Prepare socket buffer. Allocate count fields plus the terminating
+	 * null (\0).
+	 */
 	socket_ids = (int *) malloc(sizeof(int) * (sockets + 1));
 	if (!socket_ids) {
@@ -271,106 +400,23 @@
 		printf("Starting tests\n");
 
-	if (verbose)
-		printf("1 socket, 1 message\n");
-
-	if (ERROR_OCCURRED(gettimeofday(&time_before, NULL))) {
-		fprintf(stderr, "Get time of day error %d\n", ERROR_CODE);
-		return ERROR_CODE;
-	}
-
-	ERROR_PROPAGATE(sockets_create(verbose, socket_ids, 1, family, type));
-	ERROR_PROPAGATE(sockets_close(verbose, socket_ids, 1));
-	if (verbose)
-		printf("\tOK\n");
-
-	ERROR_PROPAGATE(sockets_create(verbose, socket_ids, 1, family, type));
-	if (type == SOCK_STREAM)
-		ERROR_PROPAGATE(sockets_connect(verbose, socket_ids, 1, address, addrlen));
-	ERROR_PROPAGATE(sockets_sendto_recvfrom(verbose, socket_ids, 1, address, &addrlen, data, size, 1));
-	ERROR_PROPAGATE(sockets_close(verbose, socket_ids, 1));
-	if (verbose)
-		printf("\tOK\n");
-
-	ERROR_PROPAGATE(sockets_create(verbose, socket_ids, 1, family, type));
-	if (type == SOCK_STREAM)
-		ERROR_PROPAGATE(sockets_connect(verbose, socket_ids, 1, address, addrlen));
-	ERROR_PROPAGATE(sockets_sendto(verbose, socket_ids, 1, address, addrlen, data, size, 1));
-	ERROR_PROPAGATE(sockets_recvfrom(verbose, socket_ids, 1, address, &addrlen, data, size, 1));
-	ERROR_PROPAGATE(sockets_close(verbose, socket_ids, 1));
-	if (verbose)
-		printf("\tOK\n");
-
-	if (verbose)
-		printf("1 socket, %d messages\n", messages);
-
-	ERROR_PROPAGATE(sockets_create(verbose, socket_ids, 1, family, type));
-	if (type == SOCK_STREAM)
-		ERROR_PROPAGATE(sockets_connect(verbose, socket_ids, 1, address, addrlen));
-	ERROR_PROPAGATE(sockets_sendto_recvfrom(verbose, socket_ids, 1, address, &addrlen, data, size, messages));
-	ERROR_PROPAGATE(sockets_close(verbose, socket_ids, 1));
-	if (verbose)
-		printf("\tOK\n");
-
-	ERROR_PROPAGATE(sockets_create(verbose, socket_ids, 1, family, type));
-	if (type == SOCK_STREAM)
-		ERROR_PROPAGATE(sockets_connect(verbose, socket_ids, 1, address, addrlen));
-	ERROR_PROPAGATE(sockets_sendto(verbose, socket_ids, 1, address, addrlen, data, size, messages));
-	ERROR_PROPAGATE(sockets_recvfrom(verbose, socket_ids, 1, address, &addrlen, data, size, messages));
-	ERROR_PROPAGATE(sockets_close(verbose, socket_ids, 1));
-	if (verbose)
-		printf("\tOK\n");
-
-	if (verbose)
-		printf("%d sockets, 1 message\n", sockets);
-
-	ERROR_PROPAGATE(sockets_create(verbose, socket_ids, sockets, family, type));
-	ERROR_PROPAGATE(sockets_close(verbose, socket_ids, sockets));
-	if (verbose)
-		printf("\tOK\n");
-
-	ERROR_PROPAGATE(sockets_create(verbose, socket_ids, sockets, family, type));
-	if (type == SOCK_STREAM)
-		ERROR_PROPAGATE(sockets_connect(verbose, socket_ids, sockets, address, addrlen));
-	ERROR_PROPAGATE(sockets_sendto_recvfrom(verbose, socket_ids, sockets, address, &addrlen, data, size, 1));
-	ERROR_PROPAGATE(sockets_close(verbose, socket_ids, sockets));
-	if (verbose)
-		printf("\tOK\n");
-
-	ERROR_PROPAGATE(sockets_create(verbose, socket_ids, sockets, family, type));
-	if (type == SOCK_STREAM)
-		ERROR_PROPAGATE(sockets_connect(verbose, socket_ids, sockets, address, addrlen));
-	ERROR_PROPAGATE(sockets_sendto(verbose, socket_ids, sockets, address, addrlen, data, size, 1));
-	ERROR_PROPAGATE(sockets_recvfrom(verbose, socket_ids, sockets, address, &addrlen, data, size, 1));
-	ERROR_PROPAGATE(sockets_close(verbose, socket_ids, sockets));
-	if (verbose)
-		printf("\tOK\n");
-
-	if (verbose)
-		printf("%d sockets, %d messages\n", sockets, messages);
-
-	ERROR_PROPAGATE(sockets_create(verbose, socket_ids, sockets, family, type));
-	if (type == SOCK_STREAM)
-		ERROR_PROPAGATE(sockets_connect(verbose, socket_ids, sockets, address, addrlen));
-	ERROR_PROPAGATE(sockets_sendto_recvfrom(verbose, socket_ids, sockets, address, &addrlen, data, size, messages));
-	ERROR_PROPAGATE(sockets_close(verbose, socket_ids, sockets));
-	if (verbose)
-		printf("\tOK\n");
-
-	ERROR_PROPAGATE(sockets_create(verbose, socket_ids, sockets, family, type));
-	if (type == SOCK_STREAM)
-		ERROR_PROPAGATE(sockets_connect(verbose, socket_ids, sockets, address, addrlen));
-	ERROR_PROPAGATE(sockets_sendto(verbose, socket_ids, sockets, address, addrlen, data, size, messages));
-	ERROR_PROPAGATE(sockets_recvfrom(verbose, socket_ids, sockets, address, &addrlen, data, size, messages));
-	ERROR_PROPAGATE(sockets_close(verbose, socket_ids, sockets));
-
-	if (ERROR_OCCURRED(gettimeofday(&time_after, NULL))) {
-		fprintf(stderr, "Get time of day error %d\n", ERROR_CODE);
-		return ERROR_CODE;
-	}
-
-	if (verbose)
-		printf("\tOK\n");
-
-	printf("Tested in %d microseconds\n", tv_sub(&time_after, &time_before));
+	rc = gettimeofday(&time_before, NULL);
+	if (rc != EOK) {
+		fprintf(stderr, "Get time of day error %d\n", rc);
+		return rc;
+	}
+
+	nettest1_test(socket_ids,       1,        1);
+	nettest1_test(socket_ids,       1, messages);
+	nettest1_test(socket_ids, sockets,        1);
+	nettest1_test(socket_ids, sockets, messages);
+
+	rc = gettimeofday(&time_after, NULL);
+	if (rc != EOK) {
+		fprintf(stderr, "Get time of day error %d\n", rc);
+		return rc;
+	}
+
+	printf("Tested in %d microseconds\n", tv_sub(&time_after,
+	    &time_before));
 
 	if (verbose)
