All pastes #266785 Raw Edit

Unnamed

public c v1 · immutable
·published 2006-12-04 11:10 UTC
rendered paste body
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <string.h>#include <fcntl.h>#include <sys/socket.h>#include <sys/types.h>#include <sys/stat.h>#include <arpa/inet.h>#include <netdb.h>#define PORT 8888#define HOST_NAME "localhost"#define BUCKET_SIZE 1024#define CHUNK_SIZE 128#define OUT_FILE "./binary"void get_addr(	struct sockaddr_in *addr,		const char *host_name,		int port );int get_sock();void initialize_connection(int sock, const struct sockaddr_in *addr);char *recv_data(int sock, size_t *len);char *clean_data(const char *data, size_t *len);void write_data(const char *path, const char *data, size_t len);inline void *xmalloc(size_t size);inline void *xrealloc(void *ptr, size_t size);int main(argc, argv)	int argc;	char **argv;{	int sock;	struct sockaddr_in peer;	size_t data_len;	char *data;	char *clean;	get_addr(&peer, HOST_NAME, PORT);	sock = get_sock();	initialize_connection(sock, &peer);	data = recv_data(sock, &data_len);	clean = clean_data(data, &data_len);	free(data);	data = NULL;	write_data(OUT_FILE, clean, data_len);	exit(EXIT_SUCCESS);}void get_addr(addr, host_name, port)	struct sockaddr_in *addr;	const char *host_name;	int port;{	struct hostent *host;	host = gethostbyname(host_name);	if(!host)	{		fprintf(stderr, "Failed to lookup %s\n", host_name);		exit(EXIT_FAILURE);	}	addr->sin_family = AF_INET;	addr->sin_port = htons(port);	addr->sin_addr = *((struct in_addr *)host->h_addr);	memset(&addr->sin_zero, '\0', 8);}int get_sock(){	int sock = socket(PF_INET, SOCK_STREAM, 0);	if(sock == -1)	{		perror("Failed to get socket");		exit(EXIT_FAILURE);	}	return sock;}void initialize_connection(sock, addr)	int sock;	const struct sockaddr_in *addr;{	int ret = connect(sock, (struct sockaddr *)addr, sizeof(struct sockaddr));		if(ret == -1)	{		perror("Connection failed");		exit(EXIT_FAILURE);	}}char *recv_data(sock, len)	int sock;	size_t *len;{	ssize_t received;	char *data;	size_t offset;	size_t data_len;	data = xmalloc(BUCKET_SIZE);	offset = 0;	data_len = BUCKET_SIZE;			while(1)	{		received = recv(sock, (data + offset), CHUNK_SIZE, 0);		if(received == -1)		{			perror("Receive failed");			exit(EXIT_FAILURE);		}		if(received == 0)			break;		offset += received;		// Will we spill our bucket next time?		if((data + data_len) - (data + offset) < CHUNK_SIZE)		{			data = xrealloc(data, data_len + BUCKET_SIZE);			data_len += BUCKET_SIZE;		}	}		*len = offset;	data = xrealloc(data, *len);	return data;}char *clean_data(data, len)	const char *data;	size_t *len;{	char *clean;	const char *ptr;	register unsigned int i;	register unsigned int j;	size_t new_len;	new_len = *len / 2;	clean = xmalloc(new_len);	ptr = data;	i = 0;	j = 0;	while(ptr - data < *len)	{		if(i % 2)		{			clean[j++] = *ptr;		}		ptr++;		i++;	}	*len = new_len;	return clean;}void write_data(path, data, len)	const char *path;	const char *data;	size_t len;{	int file;	size_t ret;	file = creat(path, S_IRWXU);	if(file == -1)	{		perror("Failed to open file");		exit(EXIT_FAILURE);	}		ret = write(file, data, len);	if(ret != len)	{		perror("Failed to write to file");		exit(EXIT_FAILURE);	}	}inline void *xmalloc(size)	size_t size;{	void *tmp = malloc(size);	if(!tmp)	{		fprintf(stderr, "Failed to allocate memory\n");		exit(EXIT_FAILURE);	}	return tmp;}inline void *xrealloc(ptr, size)	void *ptr;	size_t size;{	void *tmp = realloc(ptr, size);	if(!tmp)	{		fprintf(stderr, "Failed to allocate memory\n");		exit(EXIT_FAILURE);	}	return tmp;}