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 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); 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; 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.