Index: uspace/app/nettest1/nettest.c
===================================================================
--- uspace/app/nettest1/nettest.c	(revision a8e5051a633bec02a8deec21772f6cadc0da9f98)
+++ uspace/app/nettest1/nettest.c	(revision 3d459fcecedd05c16f0147a90e81b3f544b21bc3)
@@ -28,9 +28,9 @@
 
 /** @addtogroup nettest
- *  @{
+ * @{
  */
 
 /** @file
- *  Networking test support functions implementation.
+ * Networking test support functions implementation.
  */
 
@@ -43,69 +43,118 @@
 #include "print_error.h"
 
-int sockets_create(int verbose, int * socket_ids, int sockets, int family, sock_type_t type){
-	int index;
-
-	if(verbose){
+
+/** Creates new sockets.
+ *
+ * @param[in] verbose A value indicating whether to print out verbose information.
+ * @param[out] socket_ids A field to store the socket identifiers.
+ * @param[in] sockets The number of sockets to create. Should be at most the size of the field.
+ * @param[in] family The socket address family.
+ * @param[in] type The socket type.
+ * @returns EOK on success.
+ * @returns Other error codes as defined for the socket() function.
+ */
+int sockets_create(int verbose, int *socket_ids, int sockets, int family, sock_type_t type)
+{
+	int index;
+
+	if (verbose)
 		printf("Create\t");
-	}
-	fflush(stdout);
-	for(index = 0; index < sockets; ++ index){
+		
+	fflush(stdout);
+	
+	for (index = 0; index < sockets; index++) {
 		socket_ids[index] = socket(family, type, 0);
-		if(socket_ids[index] < 0){
+		if (socket_ids[index] < 0) {
 			printf("Socket %d (%d) error:\n", index, socket_ids[index]);
 			socket_print_error(stderr, socket_ids[index], "Socket create: ", "\n");
 			return socket_ids[index];
 		}
-		if(verbose){
-			print_mark(index);
-		}
-	}
-	return EOK;
-}
-
-int sockets_close(int verbose, int * socket_ids, int sockets){
-	ERROR_DECLARE;
-
-	int index;
-
-	if(verbose){
+		if (verbose)
+			print_mark(index);
+	}
+	
+	return EOK;
+}
+
+/** Closes sockets.
+ *
+ * @param[in] verbose A value indicating whether to print out verbose information.
+ * @param[in] socket_ids A field of stored socket identifiers.
+ * @param[in] sockets The number of sockets in the field. Should be at most the size of the field.
+ * @returns EOK on success.
+ * @returns Other error codes as defined for the closesocket() function.
+ */
+int sockets_close(int verbose, int *socket_ids, int sockets)
+{
+	ERROR_DECLARE;
+
+	int index;
+
+	if (verbose)
 		printf("\tClose\t");
-	}
-	fflush(stdout);
-	for(index = 0; index < sockets; ++ index){
-		if(ERROR_OCCURRED(closesocket(socket_ids[index]))){
+
+	fflush(stdout);
+	
+	for (index = 0; index < sockets; index++) {
+		if (ERROR_OCCURRED(closesocket(socket_ids[index]))) {
 			printf("Socket %d (%d) error:\n", index, socket_ids[index]);
 			socket_print_error(stderr, ERROR_CODE, "Socket close: ", "\n");
 			return ERROR_CODE;
 		}
-		if(verbose){
-			print_mark(index);
-		}
-	}
-	return EOK;
-}
-
-int sockets_connect(int verbose, int * socket_ids, int sockets, struct sockaddr * address, socklen_t addrlen){
-	ERROR_DECLARE;
-
-	int index;
-
-	if(verbose){
+		if (verbose)
+			print_mark(index);
+	}
+	
+	return EOK;
+}
+
+/** Connects sockets.
+ *
+ * @param[in] verbose A value indicating whether to print out verbose information.
+ * @param[in] socket_ids A field of stored socket identifiers.
+ * @param[in] sockets The number of sockets in the field. Should be at most the size of the field.
+ * @param[in] address The destination host address to connect to.
+ * @param[in] addrlen The length of the destination address in bytes.
+ * @returns EOK on success.
+ * @returns Other error codes as defined for the connect() function.
+ */
+int sockets_connect(int verbose, int *socket_ids, int sockets, struct sockaddr *address, socklen_t addrlen)
+{
+	ERROR_DECLARE;
+
+	int index;
+
+	if (verbose)
 		printf("\tConnect\t");
-	}
-	fflush(stdout);
-	for(index = 0; index < sockets; ++ index){
-		if(ERROR_OCCURRED(connect(socket_ids[index], address, addrlen))){
+	
+	fflush(stdout);
+	
+	for (index = 0; index < sockets; index++) {
+		if (ERROR_OCCURRED(connect(socket_ids[index], address, addrlen))) {
 			socket_print_error(stderr, ERROR_CODE, "Socket connect: ", "\n");
 			return ERROR_CODE;
 		}
-		if(verbose){
-			print_mark(index);
-		}
-	}
-	return EOK;
-}
-
-int sockets_sendto(int verbose, int * socket_ids, int sockets, struct sockaddr * address, socklen_t addrlen, char * data, int size, int messages){
+		if (verbose)
+			print_mark(index);
+	}
+	
+	return EOK;
+}
+
+/** Sends data via sockets.
+ *
+ * @param[in] verbose A value indicating whether to print out verbose information.
+ * @param[in] socket_ids A field of stored socket identifiers.
+ * @param[in] sockets The number of sockets in the field. Should be at most the size of the field.
+ * @param[in] address The destination host address to send data to.
+ * @param[in] addrlen The length of the destination address in bytes.
+ * @param[in] data The data to be sent.
+ * @param[in] size The data size in bytes.
+ * @param[in] messages The number of datagrams per socket to be sent.
+ * @returns EOK on success.
+ * @returns Other error codes as defined for the sendto() function.
+ */
+int sockets_sendto(int verbose, int *socket_ids, int sockets, struct sockaddr *address, socklen_t addrlen, char *data, int size, int messages)
+{
 	ERROR_DECLARE;
 
@@ -113,11 +162,12 @@
 	int message;
 
-	if(verbose){
+	if (verbose)
 		printf("\tSendto\t");
-	}
-	fflush(stdout);
-	for(index = 0; index < sockets; ++ index){
-		for(message = 0; message < messages; ++ message){
-			if(ERROR_OCCURRED(sendto(socket_ids[index], data, size, 0, address, addrlen))){
+
+	fflush(stdout);
+	
+	for (index = 0; index < sockets; index++) {
+		for (message = 0; message < messages; message++) {
+			if (ERROR_OCCURRED(sendto(socket_ids[index], data, size, 0, address, addrlen))) {
 				printf("Socket %d (%d), message %d error:\n", index, socket_ids[index], message);
 				socket_print_error(stderr, ERROR_CODE, "Socket send: ", "\n");
@@ -125,24 +175,39 @@
 			}
 		}
-		if(verbose){
-			print_mark(index);
-		}
-	}
-	return EOK;
-}
-
-int sockets_recvfrom(int verbose, int * socket_ids, int sockets, struct sockaddr * address, socklen_t * addrlen, char * data, int size, int messages){
+		if (verbose)
+			print_mark(index);
+	}
+	
+	return EOK;
+}
+
+/** Receives data via sockets.
+ *
+ * @param[in] verbose A value indicating whether to print out verbose information.
+ * @param[in] socket_ids A field of stored socket identifiers.
+ * @param[in] sockets The number of sockets in the field. Should be at most the size of the field.
+ * @param[in] address The source host address of received datagrams.
+ * @param[in,out] addrlen The maximum length of the source address in bytes. The actual size of the source address is set instead.
+ * @param[out] data The received data.
+ * @param[in] size The maximum data size in bytes.
+ * @param[in] messages The number of datagrams per socket to be received.
+ * @returns EOK on success.
+ * @returns Other error codes as defined for the recvfrom() function.
+ */
+int sockets_recvfrom(int verbose, int *socket_ids, int sockets, struct sockaddr *address, socklen_t *addrlen, char *data, int size, int messages)
+{
 	int value;
 	int index;
 	int message;
 
-	if(verbose){
+	if (verbose)
 		printf("\tRecvfrom\t");
-	}
-	fflush(stdout);
-	for(index = 0; index < sockets; ++ index){
-		for(message = 0; message < messages; ++ message){
+	
+	fflush(stdout);
+	
+	for (index = 0; index < sockets; index++) {
+		for (message = 0; message < messages; message++) {
 			value = recvfrom(socket_ids[index], data, size, 0, address, addrlen);
-			if(value < 0){
+			if (value < 0) {
 				printf("Socket %d (%d), message %d error:\n", index, socket_ids[index], message);
 				socket_print_error(stderr, value, "Socket receive: ", "\n");
@@ -150,12 +215,28 @@
 			}
 		}
-		if(verbose){
-			print_mark(index);
-		}
-	}
-	return EOK;
-}
-
-int sockets_sendto_recvfrom(int verbose, int * socket_ids, int sockets, struct sockaddr * address, socklen_t * addrlen, char * data, int size, int messages){
+		if (verbose)
+			print_mark(index);
+	}
+	return EOK;
+}
+
+/** Sends and receives data via sockets.
+ *
+ * Each datagram is sent and a reply read consequently.
+ * The next datagram is sent after the reply is received.
+ *
+ * @param[in] verbose A value indicating whether to print out verbose information.
+ * @param[in] socket_ids A field of stored socket identifiers.
+ * @param[in] sockets The number of sockets in the field. Should be at most the size of the field.
+ * @param[in,out] address The destination host address to send data to. The source host address of received datagrams is set instead.
+ * @param[in] addrlen The length of the destination address in bytes.
+ * @param[in,out] data The data to be sent. The received data are set instead.
+ * @param[in] size The data size in bytes.
+ * @param[in] messages The number of datagrams per socket to be received.
+ * @returns EOK on success.
+ * @returns Other error codes as defined for the recvfrom() function.
+ */
+int sockets_sendto_recvfrom(int verbose, int *socket_ids, int sockets, struct sockaddr *address, socklen_t *addrlen, char *data, int size, int messages)
+{
 	ERROR_DECLARE;
 
@@ -164,11 +245,12 @@
 	int message;
 
-	if(verbose){
+	if (verbose)
 		printf("\tSendto and recvfrom\t");
-	}
-	fflush(stdout);
-	for(index = 0; index < sockets; ++ index){
-		for(message = 0; message < messages; ++ message){
-			if(ERROR_OCCURRED(sendto(socket_ids[index], data, size, 0, address, * addrlen))){
+
+	fflush(stdout);
+	
+	for (index = 0; index < sockets; index++) {
+		for (message = 0; message < messages; message++) {
+			if (ERROR_OCCURRED(sendto(socket_ids[index], data, size, 0, address, *addrlen))) {
 				printf("Socket %d (%d), message %d error:\n", index, socket_ids[index], message);
 				socket_print_error(stderr, ERROR_CODE, "Socket send: ", "\n");
@@ -176,5 +258,5 @@
 			}
 			value = recvfrom(socket_ids[index], data, size, 0, address, addrlen);
-			if(value < 0){
+			if (value < 0) {
 				printf("Socket %d (%d), message %d error:\n", index, socket_ids[index], message);
 				socket_print_error(stderr, value, "Socket receive: ", "\n");
@@ -182,17 +264,23 @@
 			}
 		}
-		if(verbose){
-			print_mark(index);
-		}
-	}
-	return EOK;
-}
-
-void print_mark(int index){
-	if((index + 1) % 10){
+		if (verbose)
+			print_mark(index);
+	}
+	
+	return EOK;
+}
+
+/** Prints a mark.
+ *
+ * If the index is a multiple of ten, a different mark is printed.
+ *
+ * @param[in] index The index of the mark to be printed.
+ */
+void print_mark(int index)
+{
+	if ((index + 1) % 10)
 		printf("*");
-	}else{
+	else
 		printf("|");
-	}
 	fflush(stdout);
 }
Index: uspace/app/nettest1/nettest.h
===================================================================
--- uspace/app/nettest1/nettest.h	(revision a8e5051a633bec02a8deec21772f6cadc0da9f98)
+++ uspace/app/nettest1/nettest.h	(revision 3d459fcecedd05c16f0147a90e81b3f544b21bc3)
@@ -28,96 +28,23 @@
 
 /** @addtogroup nettest
- *  @{
+ * @{
  */
 
 /** @file
- *  Networking test support functions.
+ * Networking test support functions.
  */
 
-#ifndef __NET_TEST__
-#define __NET_TEST__
+#ifndef NET_TEST_
+#define NET_TEST_
 
 #include <net/socket.h>
 
-/** Prints a mark.
- *  If the index is a multiple of ten, a different mark is printed.
- *  @param[in] index The index of the mark to be printed.
- */
-extern void print_mark(int index);
-
-/** Creates new sockets.
- *  @param[in] verbose A value indicating whether to print out verbose information.
- *  @param[out] socket_ids A field to store the socket identifiers.
- *  @param[in] sockets The number of sockets to create. Should be at most the size of the field.
- *  @param[in] family The socket address family.
- *  @param[in] type The socket type.
- *  @returns EOK on success.
- *  @returns Other error codes as defined for the socket() function.
- */
-extern int sockets_create(int verbose, int * socket_ids, int sockets, int family, sock_type_t type);
-
-/** Closes sockets.
- *  @param[in] verbose A value indicating whether to print out verbose information.
- *  @param[in] socket_ids A field of stored socket identifiers.
- *  @param[in] sockets The number of sockets in the field. Should be at most the size of the field.
- *  @returns EOK on success.
- *  @returns Other error codes as defined for the closesocket() function.
- */
-extern int sockets_close(int verbose, int * socket_ids, int sockets);
-
-/** Connects sockets.
- *  @param[in] verbose A value indicating whether to print out verbose information.
- *  @param[in] socket_ids A field of stored socket identifiers.
- *  @param[in] sockets The number of sockets in the field. Should be at most the size of the field.
- *  @param[in] address The destination host address to connect to.
- *  @param[in] addrlen The length of the destination address in bytes.
- *  @returns EOK on success.
- *  @returns Other error codes as defined for the connect() function.
- */
-extern int sockets_connect(int verbose, int * socket_ids, int sockets, struct sockaddr * address, socklen_t addrlen);
-
-/** Sends data via sockets.
- *  @param[in] verbose A value indicating whether to print out verbose information.
- *  @param[in] socket_ids A field of stored socket identifiers.
- *  @param[in] sockets The number of sockets in the field. Should be at most the size of the field.
- *  @param[in] address The destination host address to send data to.
- *  @param[in] addrlen The length of the destination address in bytes.
- *  @param[in] data The data to be sent.
- *  @param[in] size The data size in bytes.
- *  @param[in] messages The number of datagrams per socket to be sent.
- *  @returns EOK on success.
- *  @returns Other error codes as defined for the sendto() function.
- */
-extern int sockets_sendto(int verbose, int * socket_ids, int sockets, struct sockaddr * address, socklen_t addrlen, char * data, int size, int messages);
-
-/** Receives data via sockets.
- *  @param[in] verbose A value indicating whether to print out verbose information.
- *  @param[in] socket_ids A field of stored socket identifiers.
- *  @param[in] sockets The number of sockets in the field. Should be at most the size of the field.
- *  @param[in] address The source host address of received datagrams.
- *  @param[in,out] addrlen The maximum length of the source address in bytes. The actual size of the source address is set instead.
- *  @param[out] data The received data.
- *  @param[in] size The maximum data size in bytes.
- *  @param[in] messages The number of datagrams per socket to be received.
- *  @returns EOK on success.
- *  @returns Other error codes as defined for the recvfrom() function.
- */
-extern int sockets_recvfrom(int verbose, int * socket_ids, int sockets, struct sockaddr * address, socklen_t * addrlen, char * data, int size, int messages);
-
-/** Sends and receives data via sockets.
- *  Each datagram is sent and a reply read consequently.
- *  The next datagram is sent after the reply is received.
- *  @param[in] verbose A value indicating whether to print out verbose information.
- *  @param[in] socket_ids A field of stored socket identifiers.
- *  @param[in] sockets The number of sockets in the field. Should be at most the size of the field.
- *  @param[in,out] address The destination host address to send data to. The source host address of received datagrams is set instead.
- *  @param[in] addrlen The length of the destination address in bytes.
- *  @param[in,out] data The data to be sent. The received data are set instead.
- *  @param[in] size The data size in bytes.
- *  @param[in] messages The number of datagrams per socket to be received.
- *  @returns EOK on success.
- *  @returns Other error codes as defined for the recvfrom() function.
- */
-extern int sockets_sendto_recvfrom(int verbose, int * socket_ids, int sockets, struct sockaddr * address, socklen_t * addrlen, char * data, int size, int messages);
+extern void print_mark(int);
+extern int sockets_create(int, int *, int, int, sock_type_t);
+extern int sockets_close(int, int *, int);
+extern int sockets_connect(int, int *, int, struct sockaddr *, socklen_t);
+extern int sockets_sendto(int, int *, int, struct sockaddr *, socklen_t, char *, int, int);
+extern int sockets_recvfrom(int, int *, int, struct sockaddr *, socklen_t *, char *, int, int);
+extern int sockets_sendto_recvfrom(int, int *, int, struct sockaddr *, socklen_t *, char *, int, int);
 
 #endif
@@ -125,2 +52,3 @@
 /** @}
  */
+
Index: uspace/app/nettest1/nettest1.c
===================================================================
--- uspace/app/nettest1/nettest1.c	(revision a8e5051a633bec02a8deec21772f6cadc0da9f98)
+++ uspace/app/nettest1/nettest1.c	(revision 3d459fcecedd05c16f0147a90e81b3f544b21bc3)
@@ -28,10 +28,13 @@
 
 /** @addtogroup nettest
- *  @{
+ * @{
  */
 
 /** @file
- *  Networking test 1 application - sockets.
- */
+ * Networking test 1 application - sockets.
+ */
+
+#include "nettest.h"
+#include "print_error.h"
 
 #include <malloc.h>
@@ -49,330 +52,12 @@
 #include <net/socket_parse.h>
 
-#include "nettest.h"
-#include "print_error.h"
-
-/** Echo module name.
- */
+/** Echo module name. */
 #define NAME	"Nettest1"
 
-/** Packet data pattern.
- */
+/** Packet data pattern. */
 #define NETTEST1_TEXT	"Networking test 1 - sockets"
 
-/** Module entry point.
- *  Starts testing.
- *  @param[in] argc The number of command line parameters.
- *  @param[in] argv The command line parameters.
- *  @returns EOK on success.
- */
-int main(int argc, char * argv[]);
-
-/** Prints the application help.
- */
-void nettest1_print_help(void);
-
-/** Refreshes the data.
- *  Fills the data block with the NETTEST1_TEXT pattern.
- *  @param[out] data The data block.
- *  @param[in] size The data block size in bytes.
- */
-void nettest1_refresh_data(char * data, size_t size);
-
-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;
-//	char address_string[INET6_ADDRSTRLEN];
-	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;
-			}
-		}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");
-		nettest1_print_help();
-		return EINVAL;
-	}
-
-	// prepare the address buffer
-	bzero(address_data, max_length);
-	switch(family){
-		case PF_INET:
-			address_in->sin_family = AF_INET;
-			address_in->sin_port = htons(port);
-			address_start = (uint8_t *) &address_in->sin_addr.s_addr;
-			addrlen = sizeof(struct sockaddr_in);
-			break;
-		case PF_INET6:
-			address_in6->sin6_family = AF_INET6;
-			address_in6->sin6_port = htons(port);
-			address_start = (uint8_t *) &address_in6->sin6_addr.s6_addr;
-			addrlen = sizeof(struct sockaddr_in6);
-			break;
-		default:
-			fprintf(stderr, "Address family is not supported\n");
-			return EAFNOSUPPORT;
-	}
-
-	// 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
-	if(size <= 0){
-		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)
-	data = (char *) malloc(size + 1);
-	if(! data){
-		fprintf(stderr, "Failed to allocate data buffer.\n");
-		return ENOMEM;
-	}
-	nettest1_refresh_data(data, size);
-
-	// check the socket count
-	if(sockets <= 0){
-		fprintf(stderr, "Socket count too small (%d). Using 2 instead.\n", sockets);
-		sockets = 2;
-	}
-
-	// prepare the socket buffer
-	// count plus the terminating null (\0)
-	socket_ids = (int *) malloc(sizeof(int) * (sockets + 1));
-	if(! socket_ids){
-		fprintf(stderr, "Failed to allocate receive buffer.\n");
-		return ENOMEM;
-	}
-	socket_ids[sockets] = NULL;
-
-	if(verbose){
-		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));
-
-	if(verbose){
-		printf("Exiting\n");
-	}
-
-	return EOK;
-}
-
-void nettest1_print_help(void){
+static void nettest1_print_help(void)
+{
 	printf(
 		"Network Networking test 1 aplication - sockets\n" \
@@ -402,10 +87,18 @@
 }
 
-void nettest1_refresh_data(char * data, size_t size){
+/** Refreshes the data.
+ *
+ * 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)
+{
 	size_t length;
 
 	// fill the data
 	length = 0;
-	while(size > length + sizeof(NETTEST1_TEXT) - 1){
+	while (size > length + sizeof(NETTEST1_TEXT) - 1) {
 		memcpy(data + length, NETTEST1_TEXT, sizeof(NETTEST1_TEXT) - 1);
 		length += sizeof(NETTEST1_TEXT) - 1;
@@ -415,4 +108,277 @@
 }
 
+
+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;
+			}
+		} 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");
+		nettest1_print_help();
+		return EINVAL;
+	}
+
+	// prepare the address buffer
+	bzero(address_data, max_length);
+	switch (family) {
+	case PF_INET:
+		address_in->sin_family = AF_INET;
+		address_in->sin_port = htons(port);
+		address_start = (uint8_t *) &address_in->sin_addr.s_addr;
+		addrlen = sizeof(struct sockaddr_in);
+		break;
+	case PF_INET6:
+		address_in6->sin6_family = AF_INET6;
+		address_in6->sin6_port = htons(port);
+		address_start = (uint8_t *) &address_in6->sin6_addr.s6_addr;
+		addrlen = sizeof(struct sockaddr_in6);
+		break;
+	default:
+		fprintf(stderr, "Address family is not supported\n");
+		return EAFNOSUPPORT;
+	}
+
+	// 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
+	if (size <= 0) {
+		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)
+	data = (char *) malloc(size + 1);
+	if (!data) {
+		fprintf(stderr, "Failed to allocate data buffer.\n");
+		return ENOMEM;
+	}
+	nettest1_refresh_data(data, size);
+
+	// check the socket count
+	if (sockets <= 0) {
+		fprintf(stderr, "Socket count too small (%d). Using 2 instead.\n", sockets);
+		sockets = 2;
+	}
+
+	// prepare the socket buffer
+	// count plus the terminating null (\0)
+	socket_ids = (int *) malloc(sizeof(int) * (sockets + 1));
+	if (!socket_ids) {
+		fprintf(stderr, "Failed to allocate receive buffer.\n");
+		return ENOMEM;
+	}
+	socket_ids[sockets] = NULL;
+
+	if (verbose)
+		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));
+
+	if (verbose)
+		printf("Exiting\n");
+
+	return EOK;
+}
+
+
 /** @}
  */
