Buenos días, he estado programando una función usando sockets para descargar un fichero, pero siento un poco insatisfecho, aunque esta funciona perfecto. Necesito alguna opinión o recomendación acerca de ella.
Código C:
Ver original/* d_package.c - Descarga de los paquetes
Este programa es software libre: usted puede redistribuirlo y/o
modificarlo bajo los términos de la Licencia Pública General de
GNU según es publicada por la Free Software Foundation, bien
sea la versión 3 de la Licencia, o (a su elección) cualquier
versión posterior.
Este programa se distribuye con la esperanza de que sea útil,
pero SIN NINGUNA GARANTÍA, incluso sin la garantía implícita de
COMERCIALIZACIÓN o IDONEIDAD PARA UN PROPÓSITO PARTICULAR. Consulte
la GNU General Public License para más detalles.
Debería haber recibido una copia de la Licencia Pública General de GNU
junto con este programa. Si no, véase <http://www.gnu.org/licenses/>.
Escrito por Alberto 'guzzan0' José Guilarte para w0rmlinux */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include "sha256.c"
#include "include/d_package.h"
int download_package (char const *name_package,
char const *mirror,
char const *architecture,
char const *sha256_check,
char const *dir_save_package) {
int status_sock;
int size_header
= strlen(name_package
)+strlen(architecture
)+20; int p_file = open(dir_save_package, O_WRONLY | O_TRUNC | O_CREAT, 664);
if (p_file < 0)
return 1;
ssize_t bytes_rev;
ssize_t bytes_recv = 0;
char http_header[size_header];
char buffer[256];
if (p_file == -1)
return 1;
if ((status_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1)
return 0;
struct hostent *addr_sock;
struct sockaddr_in st_sock;
if ((addr_sock = gethostbyname(mirror)) == NULL)
return 0;
st_sock.sin_family = AF_INET;
st_sock.sin_port = htons(80);
st_sock.sin_addr = *((struct in_addr *)addr_sock->h_addr);
memset(&(st_sock.
sin_zero), 0, 8);
if ((connect(status_sock, (struct sockaddr *)&st_sock, sizeof(st_sock))) == -1)
return 0;
snprintf(http_header
, sizeof(size_header
), "GET /package/%s/%c/%s.tar", architecture
, name_package
[0], name_package
);
if ((send(status_sock, http_header, sizeof(http_header), 0)) <= 0)
return 0;
memset(buffer
, '\0', sizeof(buffer
));
while ((bytes_rev = recv(status_sock, buffer, sizeof(buffer), 0)) > 0) {
if (bytes_rev < 0)
return 0;
write(p_file, buffer, bytes_rev);
bytes_recv += bytes_rev;
}
close(status_sock);
close(p_file);
if ((sha256_compare(dir_save_package, sha256_check)) == 32) {
return 2;
}
else {
}
return 1;
}
Lo único que ya sé, es que aún no he hecho el soporte para ipv6, pero cualquier recomendación, estaría agradecido.
Saludos.